ah ok na die funktion macht schon mehr sinn. die frage ist, wieso mehr
baudrate ;)
ehrlichgesagt hab ich nach kurzem blick ins datenblatt ein paar fälle im
kopf durchgespielt woran es liegen könnte. mir ist nix eingefallen, du
könntest aber mal OERR in RCSTA checken (siehe 22.1.2.5)
ich persönlich hab immer versucht, die isrs schlank zu halten. für
diesen fall könnte man einen puffer verwenden, in den die empfangenen
bytes abgespeichert werden. hierzu wird in der isr nur das zeichen im
puffer gespeichert. das stellt sicher, dass auch wirklich alle zeichen
verfügbar sind, wenn die umwandlung erfolgt (die uU lange dauern kann,
kenne die performance von pics nicht)
in etwa so:
1 | char _buffer[3];
|
2 | INT8U _currentPosition;
|
3 |
|
4 | void main()
|
5 | {
|
6 | ...
|
7 | _currentPosition = 0;
|
8 |
|
9 | while(1)
|
10 | {
|
11 | if(_currentPosition > 2)
|
12 | {
|
13 | _currentPosition = 0;
|
14 | SetNewPWMValue();
|
15 | }
|
16 | }
|
17 | }
|
18 |
|
19 | void interrupt isr_rs232(void)
|
20 | {
|
21 | GIE = 0; //global interrupt disable
|
22 | if(RCIF)
|
23 | {
|
24 | buffer[_currentPosition] = RCREG;
|
25 | _currentPosition++;
|
26 | }
|
27 | GIE = 1;
|
28 | }
|
29 |
|
30 | void SetNewPWMValue()
|
31 | {
|
32 | //lets hope there will be no interrupt here. set GIE=0 if shit happens
|
33 | INT8U newVal;
|
34 | //no fast way to work with atoi here. code performance shoudl be comparable
|
35 | newVal = (_buffer[1] - '0')*10 + (_buffer[2] - '0');
|
36 | switch(_buffer[0])
|
37 | {
|
38 | case 'r': rot = newVal; break;
|
39 | case 'g': gruen = newVal; break;
|
40 | case 'b': blau = newVal; break;
|
41 | default : rot = 0xFF; gruen = 0; blau = 0; break;//error indicator
|
42 | }
|
43 | PWMsetlin(rot, grun, blau);
|
44 | }
|
der puffer ließe sich beliebig erweitern, d.h. du könntest auch mehr
befehle als nur diesen senden. ein passendes kommando zum setzen der PWM
wäre zB PWMg63. wenn du nun PWM in deinem puffer erkennst, weisst du die
nächsten 3 zeichen sind dafür da, die farbe neu zu setzen.
ich weiss es ist unschön den fehler im eigenen code nicht zu finden,
aber manchmal muss man einfach redesignen ;)