www.mikrocontroller.net

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


Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef union {
  uint16_t l;
  uint8_t b[2];
} typ_mixed;

typ_mixed gs;


SIGNAL(SIG_INTERRUPT0){
        gs.l++;
}

main(void){
        MCUCR |= (1<<ISC10)|(1<<ISC00);
        uart_init();
        for(;;){
                gs.l=0
                GICR |= (1<<INT0)|(1<<INT1);
                wait(500);
                GICR &= ~(1<<INT0)|(1<<INT1);
                uart_send(gs.b[0]);
                uart_send(gs.b[1]);
       }
}


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!

Autor: brrrrrrrrrrrrrhhhhmmmmmmmmmm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: geb (Gast)
Datum:

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

Grüße Gebhard

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :-/

Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht 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 )

Autor: Hermann-Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <stdlib.h>

{
  char msg[7];

  itoa( (int)gs.l, msg, 7 );
  uart_puts( msg);
}

Hermann-Josef

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.