Hallo zusammen,
ich habe da ein merkwürdiges Verhalten, das ich mir nicht erklären kann.
Wenn ich versuche einen String über den Uart des Atmega8 auszugeben sehe
ich nur Fragezeichen auf dem Terminal. Wenn ich allerdings die funktion
itoa() benutze werden die Zahlen korrekt angezeigt...
Ich habe schon sämtliche Baudraten zw. 9600 und 57600 ausprobiert. Der
Atmega läuft mit einem externen 8MHz Quarz...
1
#define F_CPU 8000000UL
2
#define BAUD 9600UL
3
4
voidinit_usart()
5
{
6
uint16_tubrr=(F_CPU/(BAUD*8L)-1);
7
8
/* Set baud rate */
9
UBRRH=(uint8_t)(ubrr>>8);
10
UBRRL=(uint8_t)(ubrr);
11
12
/*
13
Enable receiver and transmitter; RXCIE aktiviert Interruptbetrieb
14
zum Empfangen von Daten am
15
*/
16
UCSRA=(1<<U2X);
17
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
18
19
/* Set frame format: 8data, 2stop bit */
20
UCSRC=(1<<USBS)|(3<<UCSZ0)|(1<<URSEL);
21
22
}
23
24
intuart_putc(unsignedchardata)
25
{
26
/* Wait for empty transmit buffer */
27
while(!(UCSRA&(1<<UDRE)))
28
;
29
/* Put data into buffer, sends the data */
30
UDR=data;
31
return1;
32
}
33
34
voiduart_puts(char*s)
35
{
36
while(*s)
37
{
38
uart_putc(*s);
39
s++;
40
}
41
42
}
Die Ausgabe erfolgt z.B. mit:
1
chars[7];
2
itoa(OCR1A,s,10);
3
uart_puts(s);// -> FUNKTIONIERT
4
5
// ABER
6
7
uart_puts("abc");
8
// ODER
9
charabc[]="abc";
10
uart_puts(abc);// FUNKTIONIERT NICHT
Woran kann das liegen?
PS: Ich muss noch dazusagen, das der Atmega über den MySmartUSB progger
mit Spannung via USB Port versorgt wird. Kann es sein dass die Spannung
nicht stabil genug ist?!?
Chris schrieb:
> uart_puts("abc");> // ODER> char abc[] = "abc";> uart_puts(abc); // FUNKTIONIERT NICHT>> Woran kann das liegen?
Das sollte iegentlich kein Problem sein.
Zeig mal mehr Code aus der Umgebung.
Idealerweise den kompletten Code.
> PS: Ich muss noch dazusagen, das der Atmega über den MySmartUSB progger> mit Spannung via USB Port versorgt wird. Kann es sein dass die Spannung> nicht stabil genug ist?!?
Eher unwahrscheinlich.
Chris schrieb:
> Stefan Ernst schrieb:>> Fehler bei der Hex-File-Erstellung (.data Section nicht hinzugefügt).>> Und woran erkenne ich das, bzw. wie stelle ich das ab?
Wie erstellst du denn das Hex-File?
Chris schrieb:
Hmm.
Meine ursprüngliche Vermutung war, dass du irgendwo ein Array
niederbügelst und wild in den Speicher schreibst und dabei zufällig den
String erwischt hast.
Das einzige in dieser Richtung könnte hier stecken:
> int main( void )> {> init_usart();> init_servo();>> //enable global interrupts to enable the ISR> sei();>> // Pointer auf aktuelle ServoWerte> p = &lastPoint;
Interrupts sind schon freigschaltet.
Wenn die USART vor deiser Zuweisung an p bereits einen Empfangsinterrupt
gefeuert hat, besteht die Chance, dass p benutzt wird noch ehe es einen
Wert erhalten hat.
Ich gebe zu, dass ist nicht besonders wahrscheinlich.
Trothdem sollte man es korrigieren:
Den sei() macht man immer erst, wenn ausnahmslos alles initialisiert
ist. Sonst verliert man schnell den Überblick, ob man schon darf oder
nicht. Am besten kommt der sei() als letzter Funktionsaufruf vor die
Hauptschleife
1
intmain()
2
{
3
Initialisierung
4
Grundzustandherstellen
5
6
sei()
7
while(1){
8
undlosgehts
9
}
10
}
da gibts am wenigsten Überraschungen.
Aber abgesehen davon ist mir jetzt nichts aufgefallen, was den Effekt
erklären könnte.
Noch Manöverkritik
1
switch(UDR)
2
{
3
case0x61:// 'a'
schreibs doch gleich so
1
switch(UDR)
2
{
3
case'a':
dann brauchts keinen Kommentar und man sieht auch im Code, was
angestrebt wird.
Karl heinz Buchegger schrieb:
> Den sei() macht man immer erst, wenn ausnahmslos alles initialisiert> ist. Sonst verliert man schnell den Überblick, ob man schon darf oder> nicht. Am besten kommt der sei() als letzter Funktionsaufruf vor die> Hauptschleife
Danke fuer deine Tipps. Ich werd sie mir in Zukunft zu Herzen nehmen.
Steh' ja noch ganz am Anfang der AVR Programmierung, da ist man noch
lernfaehig :) Aber ich muss sagen, es macht Spass.
Gruss
Chris schrieb:
> Karl heinz Buchegger schrieb:>> Den sei() macht man immer erst, wenn ausnahmslos alles initialisiert>> ist. Sonst verliert man schnell den Überblick, ob man schon darf oder>> nicht. Am besten kommt der sei() als letzter Funktionsaufruf vor die>> Hauptschleife>> Danke fuer deine Tipps. Ich werd sie mir in Zukunft zu Herzen nehmen.> Steh' ja noch ganz am Anfang der AVR Programmierung, da ist man noch> lernfaehig :) Aber ich muss sagen, es macht Spass.
Schade, dass ich dir da nicht mehr helfen kann.
Das Verhalten ist seltsam. All die üblichen Verdächtigen greifen nicht.
(An die Sache mit der .data Section glaub ich nicht. Da müsstest du
schon wissen, mit welchen Compiler/Linker Optionen man das umstellt.
Ausser Jörg und noch ein paar anderen kennt die aber kaum wer. Und
ausserdem müsstest du dann nicht nachfragen :-)
Nur .text landet im Hex-File, nicht auch .data.
@ Chriss:
Füge noch ein "-j .data" hinzu.
Oder noch besser: benutze MFile oder zumindest sein Makefile-Template
als Vorlage.
> Nur .text landet im Hex-File, nicht auch .data.
I stand corrected :-)
Wer macht denn auch sowas!
Makefiles kopiert man doch einfach von einer vertrauenswürdigen Quelle
und ändert tunlichst nur die Filenamen :-)
Nein. In der .text-section ist ganz hinten ein Spiegel der data
section. Die wird beim C-Start umkopiert.
Eine getrennte .data gibt es im fertigen Code nicht, wo sollte die auch
landen außer im Flash?
Hc Zimmerer schrieb:
> Nein. In der .text-section ist ganz hinten ein Spiegel der data> section. Die wird beim C-Start umkopiert.
Nein, dieser "Spiegel" ist nicht in der .text-Section enthalten. Er wird
erst "erzeugt", indem man die .data-Section dem Hex-File hinzufügt, und
dadurch hinter .text mit ins Flash programmiert wird.
Hab mir gerade ein vom AVR-Studio erzeugtest Makefile angesehen.
Da wird das so erzeugt
HEX_FLASH_FLAGS = -R .eeprom
%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
Also: Alle sections mit Ausnahme der .eeprom
Keine Ahnung wo ich das Makefile her hatte. Zumindest funktioniert es
jetzt, obwohl ich noch nicht wirklich verstanden habe warum.
Vielleicht sollte ich mir mal ein Howto bzgl. Makefiles durchlesen...
Danke nochmals fuer eure Hinweise...
Gruss
Chris