Habe hier ein wirklich blödes Problem und denke evtl. habt Ihr ja noch
ne Idee dazu...
Ich habe eine Routine geschrieben, die so lange "bf1" sendet, bis die
Gegenstelle mit einem "€"-Zeichen quittiert.
Habe es mit einer while() gelöst.
Diese gibt immer die Zeichenfolge raus aaaber setzt die ISR(RX) total
ausser kraft.
Selbst wenn ich dort delay´s einbaue oder den TX aus schalten, delay, Tx
wieder ein, dann gehts auch nicht.
TX-ISR gibt es keine.
Aber wenn ich die While-Schleife durch das nur einmalige Senden der
Zeichenkette ändere, springt er auch in die ISR!?
Controller: Mega1280 @ 16MHz
1 | So funktioniert es komischerweise nicht:
|
2 |
|
3 | Aufruf-Funktion:
|
4 |
|
5 | extern uint8_t receive_okay;
|
6 |
|
7 | void ck2(void)
|
8 | {
|
9 | while (!(receive_okay)) //So lange senden, bis ein Eurozeichen (170) zur Quittierung empfangen wurde
|
10 | {
|
11 | uart_puts_safety("bf1"); //on
|
12 | }
|
13 | }
|
14 |
|
15 |
|
16 | UART Funktion:
|
17 |
|
18 | extern uint8_t receive_okay;
|
19 |
|
20 | void uart_putc(char c)
|
21 | {
|
22 | while(!(_SFR_MEM8(0xC8) & (1<<UDRE1))); //UCSR1A ist dem Compiler nicht bekannt! Deswegen direkte SFR-Adresse
|
23 | (_SFR_MEM8(0xCE)) = c; //UDR1 ist auch nicht bekannt!
|
24 | }
|
25 |
|
26 |
|
27 | void uart_puts(char *s)
|
28 | {
|
29 | while(*s)
|
30 | uart_putc(*s++);
|
31 | }
|
32 |
|
33 |
|
34 | ISR (USART1_RX_vect)
|
35 | {
|
36 | uint8_t receive_okay_zeichen = UDR1;
|
37 |
|
38 | if (receive_okay_zeichen == 170)
|
39 | {
|
40 | receive_okay = 1;
|
41 | }
|
42 | else
|
43 | {
|
44 | receive_okay = 0;
|
45 | }
|
46 | }
|
47 |
|
48 | ---------------------------------------------------------------------------------------------------------------------------
|
49 |
|
50 | So springt er auch in die ISR:
|
51 |
|
52 | Aufruf-Funktion:
|
53 |
|
54 | extern uint8_t receive_okay;
|
55 |
|
56 | void ck2(void)
|
57 | {
|
58 | uart_puts_safety("bf1"); //on
|
59 | }
|
60 |
|
61 |
|
62 | UART Funktion:
|
63 |
|
64 | extern uint8_t receive_okay;
|
65 |
|
66 | void uart_putc(char c)
|
67 | {
|
68 | while(!(_SFR_MEM8(0xC8) & (1<<UDRE1))); //UCSR1A ist dem Compiler nicht bekannt! Deswegen direkte SFR-Adresse
|
69 | (_SFR_MEM8(0xCE)) = c; //UDR1 ist auch nicht bekannt!
|
70 | }
|
71 |
|
72 |
|
73 | void uart_puts(char *s)
|
74 | {
|
75 | while(*s)
|
76 | uart_putc(*s++);
|
77 | }
|
78 |
|
79 |
|
80 | ISR (USART1_RX_vect)
|
81 | {
|
82 | uint8_t receive_okay_zeichen = UDR1;
|
83 |
|
84 | if (receive_okay_zeichen == 170)
|
85 | {
|
86 | receive_okay = 1;
|
87 | }
|
88 | else
|
89 | {
|
90 | receive_okay = 0;
|
91 | }
|
92 | }
|
Ich hoffe, Ihr könnt mir helfen.
Habe schon so viele verschiedene Möglichkeiten getestet - ohne
wirklichen Erfolg.
Gruß, Björn