Forum: Compiler & IDEs Problem mit der Übertragung von 16-Bit Variablen über UART


von Ralf R. (rralf)


Lesenswert?

Moin moin.

Folgendes Problem: Ich hab ein Rechtecksignal an INT0, und ich will ca. 
wissen, wieviel mal pro sekunde das zwischen 0 und 5v hin und her 
schwankt ( muss nicht allzugenau sein ) und das per UART auf den PC 
übertragen. Hier ein Ausschnit aus meinem Code:
1
typedef union {
2
  uint16_t l;
3
  uint8_t b[2];
4
} typ_mixed;
5
6
typ_mixed gs;
7
8
9
SIGNAL(SIG_INTERRUPT0){
10
        gs.l++;
11
}
12
13
main(void){
14
        MCUCR |= (1<<ISC10)|(1<<ISC00);
15
        uart_init();
16
        for(;;){
17
                gs.l=0
18
                GICR |= (1<<INT0)|(1<<INT1);
19
                wait(500);
20
                GICR &= ~(1<<INT0)|(1<<INT1);
21
                uart_send(gs.b[0]);
22
                uart_send(gs.b[1]);
23
       }
24
}

Hier mein Problem: Selbst wenn ich INT0 dauernd auf Masse habe, sendet 
mir der AVR nur Kram zurueck: Zb 0x01 0xad anstatt 0x00 0x00.

Wie kann das sein? Alle anderen Kommunikationen per uart funktionieren 
einwandfrei!

von brrrrrrrrrrrrrhhhhmmmmmmmmmm (Gast)


Lesenswert?

Du benutzt kein Quartz....

Dein Programm ist unvollständig und der Linker hat es nicht gemerkt.

Du hast die (falschen) Werte in gs.b[] (falsch) reingeschrieben...

Irgendwo ein nicht atomarer Zugriff ?
(bei 2 Byte möglich, oder ?)

Vielleicht übersetzt Du auch nur ständig den falschen Source.

von Ralf R. (rralf)


Lesenswert?

Also ich benutze einen 16MhZ Quarz

Interesssant ist ja, dass wenn ich manuell in die variablen 0xabcd oder 
so reinschreibe, er das richtige überträgt, aber er ansonsten einfach 
nicht klappt

von geb (Gast)


Lesenswert?

Da wirds dann wohl immer interrupts geben.Muß man in der 
Interruptroutine nicht ein Flag löschen?

Grüße Gebhard

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>         MCUCR |= (1<<ISC10)|(1<<ISC00);
Hm, du manipulierst den Int1 und den Int0-Pin, ist das Absicht?
Du veroderst die Bits nur dazu, was stand vorher im MCUCR-Register?
Falls da vorher 0x00 drinstand, dann hast du RESERVED VALUES in die Bits 
ISC11 und ISC10 sowie ISC01 und ISC00 geschrieben...
Das solltest du dir nochmal genauer anschauen :-/

von Ralf R. (rralf)


Lesenswert?

Hab inzwischen schon die Lösung gefunden. Warum auch immer hat mein 
Terminal Programm 0x00 immer falsch interpretiert ( versteh absolut 
nicht warum, weil wenn ich TXD und RXD kurzgeschlossen habe empfing er 
auch das richtige )

von Hermann-Josef (Gast)


Lesenswert?

Hallo,

Zeichen ausserhalb des gültigen Wertebereiches von darstellbaren 
ASCII-Zeichen werden meist als Steuerzeichen interpretiert und führen 
dann je nach Terminalprogramm zu unterscheidlichen Ausgaben.

Wenn Du mit einer Brücke TxD mit RxD verbindest, wird das 
Terminalprogramm i.A. auch nur druckbare Zeichen anzeigen, weil die 
nicht druckbaren etwas schwieriger einzugeben sind.

Du müsstest die beiden Bytes zuvor noch in eine Textzeichenkette 
konvertieren.

z.B.
1
#include <stdlib.h>
2
3
{
4
  char msg[7];
5
6
  itoa( (int)gs.l, msg, 7 );
7
  uart_puts( msg);
8
}

Hermann-Josef

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.