Problem mit der Übertragung von 16-Bit Variablen über UART

OP #1311153
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!
Gast #1311261
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.
Moderator (Firma: Titel) Persönliche Seite #1316923
>         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 :-/
OP #1317303
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 )
Gast #1317724
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.