www.mikrocontroller.net

Forum: Compiler & IDEs Mega88 - Mal wieder UART


Autor: Daniel Goßmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich hatte auf dem Mega8515 nie Probleme mit dem UART, aber nun gehts 
los:

Auf einem Steckbrett steckt ein Mega88. Als Takt dient ein 
Quarzoszillator mit 12 MHz (Fuses beachtet, mit _delay_ms(1000) passt 
die Geschwindigkeit auch).
Vom PD1 gehts über den Pegelwandler des STK500 zum RS232 Umsetzer des 
PCs. (Port umgesteckt -> SPARE).
An PD1 (TxD) hängt parallel eine LED zur Kontrolle des Pegelwechsels mit 
Vorwiderstand an GND, an PC5 hängt eine LED mit Vorwiderstand an VCC.

Mein Code, WinAVR-Version: 20090313
#include <avr/io.h>  

int main (void) {    
   
   DDRC = 0xFF ; // All out
   #define BAUD 9600
   #include <util/setbaud.h>
   UBRR0H = UBRRH_VALUE;
   UBRR0L = UBRRL_VALUE;
   #if USE_2X
   UCSR0A |= (1 << U2X0);
   #else
   UCSR0A &= ~(1 << U2X0);
   #endif

    // Enable transmitter 
    UCSR0B = (1<<TXEN0);
    // Set frame format: 8data, 1stop bit
    UCSR0C =  (1<<UCSZ01)|(1<<UCSZ00);  
  
  while(1) {
  
    // Wait for empty transmit buffer
    while (!(UCSR0A & (1<<UDRE0))){
      
      // In diese Schleife wird nur 1x gesprungen
      
      // Put data into buffer, sends the data
      UDR0 = 0x55 ;
      
      PORTC ^= (1<<PC5) ; // Test LED
    } ;
  } ;
 } ;     

Nun scheint es so, als wenn das UDR nur einmal beschrieben wird, 
zumindest wird die Schleife nur einmal durchlaufen (mit AVR-Studio 
getestet). Die LED am TxD-Port PD1 geht dauer an, geht aber nicht wieder 
aus, auch kein Flackern.
Die LED an PC5 bleibt ebenso dauer an, kein Flackern.

Jemand eine Idee die Tomaten auf meinen Augen weg zu pulen?

Gruß
Daniel

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   while (!(UCSR0A & (1<<UDRE0))){
      UDR0 = 0x55 ;
      PORTC ^= (1<<PC5) ;
    } ;
->
   while (!(UCSR0A & (1<<UDRE0))){
   }
   UDR0 = 0x55 ;
   PORTC ^= (1<<PC5) ;

Autor: Daniel Goßmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arrrgh! Super, Danke!

Daniel

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Goßmann schrieb:
>
> #include <avr/io.h>
> 
> int main (void) {
> 
>    DDRC = 0xFF ; // All out
>    #define BAUD 9600
>    #include <util/setbaud.h>
> 
sorry aber was hat hier ein PRÄprozessor zu suchen??
würd ich so machen:
#include <avr/io.h>
#include <util/setbaud.h>
#define BAUD 9600


int main (void) {
   DDRC = 0xFF ; // All out
Du musst dir vorstellen wenn der code mal gewartet werden soll (aus 
irgend einem Grund z.B umschreiben auf anderen Prozessor), dann viel 
Spass beim ändern. So hast du alles schön in den ersten paar Zeilen 
deklariert.
Kriegt der Combiler so nicht auch ein Problem??


>
>   while(1) {
> 
>     // Wait for empty transmit buffer
>     while (!(UCSR0A & (1<<UDRE0))){
> 
>       // In diese Schleife wird nur 1x gesprungen
> 
>       // Put data into buffer, sends the data
>       UDR0 = 0x55 ;
> 
>       PORTC ^= (1<<PC5) ; // Test LED
>     } ;
>   } ;
>  } ;     
> 
Schöne Semikolons nach den Struckturblöcken, aber diese brachts nicht.
while(1){
  // mach was
}

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, hab noch was entdeck:
> #include <avr/io.h>  
> // .....
> int main (void) {     
>   
>   while(1) {
>     while (!(UCSR0A & (1<<UDRE0))){
>       // ...
>     } ;
>   } ;
>  } ;
> 
deine main-Funktion kann so nicht funktionieren: sollte zumindest eine 
Fehlermeldung kommen (" wrong function type or missing return")
int main(void){
// ....
   while(1){
      //....
   }
return 0;
}

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.