mikrocontroller.net

Forum: Compiler & IDEs uart problem aufm atmega32


Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "uart-routines.h"

#define F_CPU 18000000UL

#include <util/delay.h>

int main(void)
{
  DDRD = 0xE;
  PORTD = 255;

  char test;
  
  uart_init( UART_BAUD_SELECT(9600,F_CPU) ); 
    
  sei();

    uart_puts_P("reset");

  for(;;)
  {
    test = uart_getc();
    uart_putc(test);
  }
}

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

Autor: Matthias Larisch (matze88)
Datum:

Bewertung
0 lesenswert
nicht 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:
const char mein_string[] PROGMEM = "Hallo!";
dann einfach mit mein_string als Parameter aufrufen.

cu
Matze

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mega 32 mit : #define F_CPU 18000000UL ?!?!? => 18MHz

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

Autor: Peter (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.
ISR(USART_TXC_vect)
/*************************************************************************
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
**************************************************************************/
...

ISR(USART_RXC_vect)
/*************************************************************************
Function: UART Data Register Empty interrupt
Purpose:  called when the UART is ready to transmit the next byte
**************************************************************************/
...

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

Autor: Matthias Larisch (matze88)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, wenn ich das drehe empfange ich gar nichts mehr.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beachte den Zusatz, den ich meinem Post noch hinzugefügt hatte.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also,
ich hab nun so:
ISR(USART_RXC_vect)
/*************************************************************************
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
**************************************************************************/
...

ISR(USART_UDRE_vect)
/*************************************************************************
Function: UART Data Register Empty interrupt
Purpose:  called when the UART is ready to transmit the next byte
**************************************************************************/
...
[c]

das Programm sieht so aus:
[c]
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "uart-routines.h"

#define F_CPU 18000000UL

#include <util/delay.h>

int main(void)
{
  PORTD = 255;
  DDRD = 6;

  int test;
  
  uart_init( UART_BAUD_SELECT(9600,F_CPU) ); 
    
  sei();
  

       uart_puts_P("blum");

  for(;;)
  {
    test = uart_getc();
    uart_putc(test);
                uart_puts_P("reset");
  }
}

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

Autor: Stefan Ernst (sternst)
Datum:

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

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.