www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega88 USART


Autor: LC-HC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

nachdem sich nun das Problem mit den Interrupts gelöst hat, macht der 
USART nun nicht das, was er soll.
ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider 
kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen 
an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der 
korrekten Baudrate verschickt. Jetzt wird der geneigte Btrachter sagen, 
dass die serielle Schnittstelle defekt wäre, ist sie aber nicht. 
getestet. Vielleicht ist es wieder eine dieser kleinigkeiten, über die 
ich immer stolpere. Den Code habe ich nochmal gepostet. Vielleicht hat 
jemand ja Anregungen oder tips ?
//uart0.c





#include <avr/io.h>
#include <avr/interrupt.h>


#define myBRR0 51 // BAUDRATE 9600 bps

volatile unsigned char i = 0;
volatile unsigned char rxFlag = 0;
unsigned char rxCh; 

void Uart0Init(void);
void putc(unsigned char ch);
void puts(unsigned char *str);

void Timer0(unsigned char time);


ISR( TIMER0_OVF_vect )
{
  
}

ISR( USART_RX_vect )
{
  rxCh = UDR0;
  putc(rxCh);
}





void main(void)
{
  
  //STATUS LEDs
  DDRC = (1<<5);
  DDRB = (1<<7);
  
  //POWER REDUCTION REGISTER
  PRR = (1<<7) | (1<<2) | (1<<0);
  
  Uart0Init();
  
    
  sei(); // Interrupts einschalten
  
  
  Timer0(0);
  
  for(;;)
  {    
    
      while( !( TIFR0 & (1<<TOV0) ) )
        ;
    
      
      while( !( UCSR0A & (1<<UDRE0) ) ) 
        ;
      UDR0 = 'a';
      
  }
  
}





void Uart0Init(void)
{
  

    UBRR0H = (unsigned char)(myBRR0 >> 8);
    UBRR0L = (unsigned char)myBRR0;
    
    UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
    
    UCSR0C = (3<<UCSZ00);  // 8-Bit Charaktersize
    
  
}


void puts(unsigned char *str)
{
  while(*str)
  {
    putc(*str);
    str++;
  }
}



void Timer0(unsigned char time)
{
  //time = vielfaches von 0,128ms
  /* time Lookuptable der aktueller Konfiguration 19.03.07
    time 0.. - 255
    00 = 0,00 ms
    10 = 1,28 ms
    20 = 2,56 ms
    30 = 3,84 ms
    40 = 5,12 ms
    50 = 6,40 ms
    ...
  */
  
  
  TCNT0 = 128;
  TIMSK0  |= (1 << TOIE0);         // Timer 0 Overflow Interrupt
  TCCR0B = (1<<CS01) | (1<<CS00);   // Teiler 1024  
  
  
}

mfg,

Simon

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@LC-HC

>ICh möcht ezu beginn nur mal alle x-sek. ein Zeichen ausgeben. Leider
>kommt aber am Terminal nichts, bzw. nur ab un dzu fehlerhafte zeichen
>an. Auf dem Oszi betrachtet, werden aber richtige Zeichen mit der
>korrekten Baudrate verschickt.

Ist im Terminalprogramm die richtige Baudrate eingestellt?

MFG
Falk

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Auf dem Oszi betrachtet, werden aber richtige Zeichen mit
> der korrekten Baudrate verschickt.

Daraus muss man ja wohl den Schluss ziehen, dass das Problem nicht beim 
Microcontroller liegt, oder?

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...welche Taktquelle verwendet der Controller (interner RC oder Quarz)?

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guckst du mit dem Oszi auf der TTL-Seite am AVR oder auf der +-12V-Seite 
hinter dem Pegelwandler?

Autor: LC-HC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI, danke für die antworten. Die DAten liegen sowohl am TTL, als auch 
zwischen Treiber und PC in gleicher Form an. Da ich aber noch nebenbei 
mit einem M16C arbeite und der ohne Probleme seine Debuganweisungen 
ausgibt, kanns der PC nicht sein. Der µC verwendet den internen 8Mhz 
Takt.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der µC verwendet den internen 8Mhz Takt.
Und genau da könnte das Problem liegen...

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teste mal den RS232-Treiber, indem du auf seiner TTL-Seite RX und TX 
verbindest (den AVR aus der Fassung nehmen und nen Draht in die Fassung 
stecken) und vom PC aus sendest.

Wenn die Daten dann korrekt zum PC zurückkommen: Treiber in Ordnung, 
Fehler beim AVR. Ansonsten kann der Fehler auch im Treiber liegen.

Autor: LC-HC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, Problem gelöst !? Es lag am Kabel. Der M16C ließ sich jedoch mit dem 
selben Kabel ohne Probleme lesen und flashen ... ?

Danke nochmal !

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.