Forum: Compiler & IDEs uart problem aufm atmega32


von Peter (Gast)


Angehängte Dateien:

Lesenswert?

N'abend,
ich hab ein Problem mit dem UART auf dem ATMEGA32. Ich verwend die 
Bibliothek von Fleury, siehe Anhang, und hab nen kleines Testprogramm 
zusammengebastelt nur um die Funktionalität zu testen.
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
6
#include "uart-routines.h"
7
8
#define F_CPU 18000000UL
9
10
#include <util/delay.h>
11
12
int main(void)
13
{
14
  DDRD = 0xE;
15
  PORTD = 255;
16
17
  char test;
18
  
19
  uart_init( UART_BAUD_SELECT(9600,F_CPU) ); 
20
    
21
  sei();
22
23
    uart_puts_P("reset");
24
25
  for(;;)
26
  {
27
    test = uart_getc();
28
    uart_putc(test);
29
  }
30
}
Das Problem an der Sache ist nun von reset seh ich in minicom nur "re" 
auch wenn ich irgendeinen anderen String angeben kommen immer nur die 
ersten beiden Zeichen und das mit uart_getc funktioniert anscheinend gar 
nicht, da kann ich auf der tastertur rumhämmern wie ich will.
Einer eine Idee voran das liegen koennte? An den 18 Mhz denk ich mal 
nicht.
Ach so Fuses sind: hfuse: 0xc9 und lfuse 0x3f.
Herzlichen Dank
Peter

von Matthias L. (matze88)


Lesenswert?

Was macht denn die Funktion uart_puts_P? Im Anhang gibt es nur eine mit 
kleingeschriebenem p. Die übrigens arbeitet auf dem Programmemory, d.h. 
du musst deine Konstante auch dort anlegen:
1
const char mein_string[] PROGMEM = "Hallo!";
dann einfach mit mein_string als Parameter aufrufen.

cu
Matze

von gast (Gast)


Lesenswert?

Mega 32 mit : #define F_CPU 18000000UL ?!?!? => 18MHz

Problm bei der Bautdratenberechung : Bit-Fehler >2% ?

von Peter (Gast)


Lesenswert?

morgen, nach Berechnung kommt ein Baudrahtfehler von 1,6 Promille raus, 
daran kann es net liegen. Bei nem anderen Atmega, wo ich uart ohne lib 
implementiert hab laeufts auch mit 18 MHz. uart_puts_P
1
#define uart_puts_P(__s)       uart_puts_p(PSTR(__s))
Wie gesagt im Endeffeckt hab ich nur von Peter Fleury[1] die uart-lib um 
die ganzen anderen Controller erleichtert. Bei ihm steht nicht drin das 
man erst nen char im PROGMEM anlegen muss.

Gruß
Peter
[1]http://homepage.hispeed.ch/peterfleury/uartlibrary.zip

von Stefan E. (sternst)


Lesenswert?

Peter wrote:

> Wie gesagt im Endeffeckt hab ich nur von Peter Fleury[1] die uart-lib um
> die ganzen anderen Controller erleichtert.

Und dabei hast du es irgendwie geschafft, den Code der beiden Interrupts 
zu vertauschen.
1
ISR(USART_TXC_vect)
2
/*************************************************************************
3
Function: UART Receive Complete interrupt
4
Purpose:  called when the UART has received a character
5
**************************************************************************/
6
...
7
8
ISR(USART_RXC_vect)
9
/*************************************************************************
10
Function: UART Data Register Empty interrupt
11
Purpose:  called when the UART is ready to transmit the next byte
12
**************************************************************************/
13
...

Außerdem verwendet der Fleury-Code gar nicht den 
Transmission-Complete-Interrupt, sondern (wie es auch im Kommentar 
steht) den Data-Register-Empty-Interrupt.

von Matthias L. (matze88)


Lesenswert?

Nach solch einem Fehler hab ich eben natürlich nicht geguckt, dann ist 
auch mehr oder weniger klar, warum es nicht geht... Auch zu dem _p _P 
Problem: Wenn man Code anhängt, dann bitte auch vollständig. Mir ist die 
genannte Lib nur vom Namen her bekannt, deshalb wusste ich nicht, was 
noch so für defines dazu gehören.
Naja, immerhin sollte ja jetzt mit dem Tip von Stefan Ernst alles 
funktionieren, oder?

Matze

von Peter (Gast)


Lesenswert?

hm, wenn ich das drehe empfange ich gar nichts mehr.

von Stefan E. (sternst)


Lesenswert?

Beachte den Zusatz, den ich meinem Post noch hinzugefügt hatte.

von Peter (Gast)


Lesenswert?

also,
ich hab nun so:
1
ISR(USART_RXC_vect)
2
/*************************************************************************
3
Function: UART Receive Complete interrupt
4
Purpose:  called when the UART has received a character
5
**************************************************************************/
6
...
7
8
ISR(USART_UDRE_vect)
9
/*************************************************************************
10
Function: UART Data Register Empty interrupt
11
Purpose:  called when the UART is ready to transmit the next byte
12
**************************************************************************/
13
...
14
[c]
15
16
das Programm sieht so aus:
17
[c]
18
#include <stdlib.h>
19
#include <avr/io.h>
20
#include <avr/interrupt.h>
21
#include <avr/pgmspace.h>
22
23
#include "uart-routines.h"
24
25
#define F_CPU 18000000UL
26
27
#include <util/delay.h>
28
29
int main(void)
30
{
31
  PORTD = 255;
32
  DDRD = 6;
33
34
  int test;
35
  
36
  uart_init( UART_BAUD_SELECT(9600,F_CPU) ); 
37
    
38
  sei();
39
  
40
41
       uart_puts_P("blum");
42
43
  for(;;)
44
  {
45
    test = uart_getc();
46
    uart_putc(test);
47
                uart_puts_P("reset");
48
  }
49
}

Er eigt mir ganz kurz blum an danach kommt aber:
AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
reinschreiben kann ich jetzt auch und es wird wieder zurueckgegeben. 
Also bis auf dieses Phänomen mit AT... funktioniert es schon mal.
Herzlichen Dank

von Stefan E. (sternst)


Lesenswert?

Du solltest mal einen Blick in die Doku von minicom werfen, denn 
anscheinend versucht es, ein Modem zu initialisieren.

Und ein Blick in die Fleury-Doku bezüglich uart_getc wäre auch nicht 
verkehrt, denn es arbeitet nicht so, wie du anscheinend denkst.

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.