Forum: Compiler & IDEs ATmega1284p, UART Probleme


von Tim (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab einen mega1284p und wollte den UART mal zum Laufen bringen.
Ich hab die Libary von P Fleury genommen und den mega1284p eingetragen, 
was aber wohl nicht funktioniert. Ich bekomm aus dem UART nichts raus 
und habe folgende Warnmeldungen:


Warning  1  'SIG_USART_RECV' appears to be a misspelled signal handler 
xxxx\uart.c  243  1
Warning  2  'SIG_USART_DATA' appears to be a misspelled signal handler 
xxxx\uart.c  286  1
Warning  3  'SIG_USART1_RECV' appears to be a misspelled signal handler 
xxxx\uart.c  475  1
Warning  4  'SIG_USART1_DATA' appears to be a misspelled signal handler 
xxxx\uart.c  510  1

Warning  5  #warning "Compiler optimizations disabled; functions from 
<util/delay.h> won't work as designed"



Mein Code und die uart.c liegen in den Anhängen:


Viele Grüße Tim

von Thomas B. (nichtessbar)


Lesenswert?

Deinen Code braucht man dazu nicht, wenn man sich die Mühe macht zu 
lesen was der Compiler ausspuckt..

http://www.atmel.com/dyn/resources/prod_documents/doc8059.pdf (Seite 
60/61)

und Warning 5 überlass ich mal deinem Hausverstand und Google..

Hatte eigtl. schon die gesamte Antwort inkl. Problemlösung hier stehen, 
aber Faulheit soll man nicht auch noch unterstützen, finds selbst raus, 
anders lernt man nichts..

von Tim (Gast)


Lesenswert?

Warnung 5 ist schon klar, google spuckt bei den anderen nichts 
sinnvolles aus


Die Vectoren stimmen nicht überein?

Sorry, aber für nen Anfänger spuckt google echt nichts interessantes aus

von Thomas B. (nichtessbar)


Lesenswert?

http://www.google.at/#sclient=psy-ab&hl=de&site=&source=hp&q=appears+to+be+a+misspelled+signal+handler&pbx=1&oq=appears+to+be+a+misspelled+signal+handler&aq=f&aqi=g-L1&aql=&gs_sm=e&gs_upl=558l558l0l822l1l1l0l0l0l0l108l108l0.1l1l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=107b95f0396d2de5&biw=1680&bih=900

Und der Link den ich dir gegeben hab ist das Datenblatt deines 
Controllers, auf Seite 60 und 61 steht wie die Vektoren richtig heißen

Tim schrieb:
> Warning  1  'SIG_USART_RECV' appears to be a misspelled signal handler
> xxxx\uart.c  243  1

wird sich beheben indem du an entsprechender Stelle USART0_RX_vect 
schreibst (die Spalte Source aus dem Datenblatt und hinten das _vect 
noch dran...)


Versuch doch mal die gesamte USART selbst auszuprogrammieren, wenn du 
Anfänger bist ist das tödlich wenn du fertigen Code verwendest und nicht 
ansatzweise weißt was passiert und hier wirst du nur auf Widerwillen 
stoßen, wenn man nicht bereit ist sich selbst in die Thematik einzulesen 
;)

Schau hier auch das Tutorial an, da steht speziell für Anfänger alles 
was du brauchst...

Solange du solche normalerweise einfache Probleme nicht in den Griff 
bekommst würd ich keine Library angreifen sondern alles selbst schreiben 
- dauert, kostet Nerven aber rentiert sich im Endeffekt

von noname (Gast)


Lesenswert?

das sind aber die Interrupts für das Anzeigen einer fertigen 
Übertragung^^ und nicht die gesuchten für das eintreffen der ersten 
Nachricht

von Heinz (Gast)


Lesenswert?

Horst schrieb im Beitrag #2523156:
> Tim ist nicht nur faul sondern auch noch geistig behindert. Aber man
> darf solche Leute ja nicht diskriminieren.
Host, dein Geburtsdatum passt in eine Zeit, wo ebensolche Namen vegeben 
wurden.

von Tim (Gast)


Lesenswert?

tja, darauf bin ich schon selber auch gekommen, es funktioniert aber 
auch nicht, wenn man in der uart.c die SIG_USART0_RECV durch 
USART0_RX_vect und so weiter erstzt.

Am Montag kann ich mit dem Oszi mal nachschauen, aber das Multimeter 
zeigt mir auch eine konstante DC Spannung von etwa 9V am Pin2 meiner 
RS232 Schnittstelle (hängt an einem MAX232

von Karl H. (kbuchegg)


Lesenswert?

Solange du die Warnungen nicht wegkriegst, kannst du dein Oszi 
wegpacken.

Da sind einfach nur die Interrupt Namen für deinen µC falsch.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ISR


(Und man beachte auch, dass in dem Code noch die alte SIGNAL Notation 
verwendet wird und nicht die 'neuere' ISR Notation)

von Fuses für AVR 1284p richtig gesetzt? (Gast)


Lesenswert?

die hab ich ausgetauscht^^, Warnungen sind verschwunden, der ganze Rest 
passt aber nach Liste die ich in Google gefunden hab, daher versteh ichs 
nicht, wieso das senden einfach nicht klappt.

das Oszi zeigt einen dauernden Highpegel mit 5V, also ist das Teil 
inaktiv

Pins sind alle auf Ausgang gesetzt, Daten empfangen will ich ja noch 
garnet

von Karl H. (kbuchegg)


Lesenswert?

Fuses für AVR 1284p richtig gesetzt? schrieb im Beitrag #2525237:
> die hab ich ausgetauscht^^

Wie genau hast du das gemacht?

Du hast gesehen, dass der Code in uart.c schon für den 1284P vorbereitet 
ist?

von Tim (Gast)


Lesenswert?

^^

das hab ich hinzugeschrieben, ursprünglich stands nicht drinne.

Ich bin nach den Namen in der iom1284p.h gegangen



Also, konkrat hab ich:

#define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA

mit

#define UART0_TRANSMIT_INTERRUPT  USART0_RXC_vec

ersetzt

__________________________________________________

#define UART0_TRANSMIT_INTERRUPT  SIG_UART0_DATA

mit

#define UART0_TRANSMIT_INTERRUPT  USART0_TX_vect


Denke, das war richtig?

Gruß Tim

von Oliver (Gast)


Lesenswert?

Tim schrieb:
> Denke, das war richtig?

Denke, das nicht. Dein Text ist aber etwas wirr.

Oliver

von Tim (Gast)


Lesenswert?

Ich habs mir jetzt nochmal bisschen angeschaut.

in der IOM1284 stehen folgende Vektoren:
1
#define USART0_RX_vect    _VECTOR(20)  /* USART0, Rx Complete */
2
#define USART0_UDRE_vect  _VECTOR(21)  /* USART0 Data register Empty */
3
#define USART0_TX_vect    _VECTOR(22)  /* USART0, Tx Complete */



Mein Code in der uart.c
1
#elif defined(__AVR_ATmega1284P__)
2
 /* ATmega with two USART */
3
 #define ATMEGA_USART0
4
 #define ATMEGA_USART1
5
 #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
6
 #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
7
 #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
8
 #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
9
 #define UART0_STATUS   UCSR0A
10
 #define UART0_CONTROL  UCSR0B
11
 #define UART0_DATA     UDR0
12
 #define UART0_UDRIE    UDRIE0
13
14
 #define UART1_STATUS   UCSR1A
15
 #define UART1_CONTROL  UCSR1B
16
 #define UART1_DATA     UDR1
17
 #define UART1_UDRIE    UDRIE1


Ich hab langsam den Verdacht, dass der Controller in dieser Funktion 
hängen bleibt, ich verstehs nur nicht ganz wieso:
1
void uart_puts(const char *s )
2
{
3
    while (*s) 
4
      uart_putc(*s++);
5
6
}/* uart_puts */

Die Funktion ist ja wieder abhängig von dieser

1
void uart_putc(unsigned char data)
2
{
3
    unsigned char tmphead;
4
5
    
6
    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
7
    
8
    while ( tmphead == UART_TxTail ){
9
        ;/* wait for free space in buffer */
10
    }
11
    
12
    UART_TxBuf[tmphead] = data;
13
    UART_TxHead = tmphead;
14
15
    /* enable UDRE interrupt */
16
    UART0_CONTROL    |= _BV(UART0_UDRIE);
17
18
}/* uart_putc */

Ich vermute, dass es an diesem Codeteil liegt, was haltet ihr davon?
1
UART_TxBuf[tmphead] = data;
2
    UART_TxHead = tmphead;
3
4
    /* enable UDRE interrupt */
5
    UART0_CONTROL    |= _BV(UART0_UDRIE);


Grüße Tim

von Stefan E. (sternst)


Lesenswert?

Tim schrieb:
> Ich hab langsam den Verdacht, dass der Controller in dieser Funktion
> hängen bleibt, ich verstehs nur nicht ganz wieso:

Weil du versuchst, haufenweise Zeugs in einer ISR zu senden.

von vandersar (Gast)


Lesenswert?

das ist die Senderoutine von P Fleury und die funktioniert normalerweiße 
selbst auf den kleineren ATmega.

Ich würde zwar eher den Vector UART0_TEX_vect nehmen, aber das scheint 
ja laut google ein paar probleme zu machen.


Ich würd auch auf die Register tippen, habs mir aber mal in der avr libc 
durchgeschaut und da hab ich keine mit ner Erweiterung von 0 und 1 
gefunden

Gruß Vandensar und ärger dich nicht über das, dass es nicht geht

von Karl H. (kbuchegg)


Lesenswert?

vandersar schrieb:

> Ich würd auch auf die Register tippen,

Ich würde vor allen Dingen erst mal ein einfaches Testprogramm 
schreiben. (Und könnte mich immer noch in den Allerwertesten beissen, 
mir sein Programm nicht angesehen zu haben).
Wenn man etwas in Betrieb nimmt, dann fängt man nicht gleich mit dem 
kompliziertesten Fall an, sondern macht erst mal ein ganz einfaches 
Beispiel um zu sehen ob die Lib grundsätzlich funktioniert. Erst dann 
kommen die Fehler, die man bei der Verwendung machen kann dazu.

Und Stefan hat recht: Die Verwendung in einer ISR ist gaaaaanz schlecht. 
Denn das gibt einen sauberen Deadlock.

von Tim (Gast)


Lesenswert?

@Thomas

Ich hab jetzt deinen Rat befolgt und es selbst programmiert und siehe 
da, es funktioniert.

Das ganze hat mich jetzt ein paar Stunden gekostet, wer den code will, 
kriegt ihn :-)

von Thomas B. (nichtessbar)


Lesenswert?

Und gelernt hast du auch noch was dabei ;)

Wobei die Fleurylib normal wirklich gut ist, hab mich aber mit diesem 
speziellen Problem hier zugegebenermaßen nicht näher beschäftigt...

von Karl H. (kbuchegg)


Lesenswert?

Thomas Bergmüller schrieb:
> Und gelernt hast du auch noch was dabei ;)
>
> Wobei die Fleurylib normal wirklich gut ist, hab mich aber mit diesem
> speziellen Problem hier zugegebenermaßen nicht näher beschäftigt...

Die Fleury Lib puffert Ausgaben und gibt sie nach und nach interrupt 
gesteuert über die UART aus. Dadurch braucht das Hauptprogramm nicht auf 
die UART warten, sofern es nicht zuviel in zu kurzer Zeit rausbläst. 
Passiert das, dann wartet die Zeichenausgabe, bis im Puffer Platz wird.

Nur leider, leider. In einer ISR kommen keine anderen Interrupts durch. 
Die Ausgabefunktion wartet bis zum St. Nimmerleinstag darauf, dass 
Transmit-Completed Interrupts etwas Platz im Puffer schafffen, was aber 
nicht passiert, weil - Interrupts in einer ISR ja gesperrt sind.

Eigentlich ganz einfach. Und wenn man sich an die Grundregel hält "In 
einer ISR wird nichts zeitaufwändiges gemacht, vor allen Dingen keine 
Ausgaben auf LCD oder UART", dann ist das auch überhaupt kein Problem.

von Thomas B. (nichtessbar)


Lesenswert?

Im Xmega mit mehreren Interruptlevels (oder Oldschool mit 8051 is glaub 
ich auch gegangen wenn ich mich recht erinnere?) würds vermutlich besser 
hinhaun...

Ich handhabs mit ISRs immer so dass Flags gesetzt werden und in der Main 
abgearbeitet wird. Allerdings Acknowledges und Kommandoantworten sende 
ich ab und zu auch innerhalb der ISR wenns schnell genug geht. Hab ich - 
bis jetzt - noch keine Probleme damit gehabt, ist aber zugegebenermaßen 
vermutlich relativ dünnes Eis..

von Oliver (Gast)


Lesenswert?

Thomas Bergmüller schrieb:
> Hab ich -
> bis jetzt - noch keine Probleme damit gehabt, ist aber zugegebenermaßen
> vermutlich relativ dünnes Eis..

Wieso? Das ist auch für MC's mit Interruptcontroller und ISR-Hirarchie 
eine sehr bewährte Strategie.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver schrieb:
> Thomas Bergmüller schrieb:
>> Hab ich -
>> bis jetzt - noch keine Probleme damit gehabt, ist aber zugegebenermaßen
>> vermutlich relativ dünnes Eis..
>
> Wieso? Das ist auch für MC's mit Interruptcontroller und ISR-Hirarchie
> eine sehr bewährte Strategie.

Aber nur, wenn man acht gibt.

Es ist wichtig, dass man Dinge wie LCD oder UART als 'shared Resource' 
ansieht und wenn man das in einem Interrupt verwenden will, darauf 
achtet sich keine Race Conditions einzuhandeln.

Letzten Endes geht es immer um die Fragestellung: Was ist, wenn in der 
Ausgaberoutine an beliebiger Stelle ein Interrupt zuschlägt, der 
seinerseits die Ausgaberoutine benutzen will. Und das 'an beliebiger 
Stelle' muss man wörtlich nehmen! AUch muss man sich überlegen, dass ein 
Ausgabegerät im Regelfall so etwas wie einen Cursor hat, den man 
ebenfalls als Shared Resource ansehen muss. Es ist nicht akzeptabel, 
wenn eine einzeln ISR-Ausgabe dazu führt, dass ein anderer Text mitten 
drinn unterbrochen wird und an einer ganz anderen Stelle fertig 
geschrieben wird.

ALles in allem ist das Thema nicht so einfach wie es zunächst scheint.

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.