ATMega644 UART

Gast #4510156
Lesenswert?
• ▲
▼
Hallo Forum,

ich besitze einen AtMega644, nun würde ich gerne Daten vom Analog 
Wandler über den UART ausgeben.
bei meinem ATMega32 funktioniert dies ohne Probleme. bei dem ATMega644 
komm am UART nichts an. Die Übertragung erfolgt ohne Probleme. Kann mir 
jemand sagen was ich falsch mache?

Hier ist mein Code:
#ifdef F_CPU
#undef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>




// Diese Beispiel zeigt die Anwendung des ADC eines ATmega169
// unter Verwendung der internen Referenzspannung von nominell 1,1V.
// Zur Anpassung an andere AVR und/oder andere Referenzspannungen
// siehe Erläuterungen in diesem Tutorial und im Datenblatt

/* ADC initialisieren */
void ADC_Init(void)
{
  // die Versorgungsspannung AVcc als Referenz wählen:
  //ADMUX = (1<<REFS0);
  // oder interne Referenzspannung als Referenz für den ADC wählen:
  ADMUX = (1<<REFS1) | (1<<REFS0);

  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
  // schon auf 0, also single conversion
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu 
lassen" */

  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der 
Konvertierung warten
  }
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  (void) ADCW;
}

/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung 
warten
  }
  return ADCW;                    // ADC auslesen und zurückgeben
}


void USART_Init( unsigned int baud )
  {
    /*Set baud rate*/
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* Enable receiver and transmitter*/
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit*/
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
  }


  void USART_Transmit( unsigned char data )
  {
    /* Wait for empty transmit buffer*/
    while
     ( !( UCSRA & (1<<UDRE)) );
    /* Put data into buffer, sends the data*/
    UDR = data;
  }

  void uart_puts( char *s )
  {
    /* while *s != '\0' so unequally "string-end characters (terminator) 
*/
    while (*s)
    {
      USART_Transmit(*s);

      s++;
    }
  }


void main(void)
{
  USART_Init(0x67);
  char String[16] = {"Test "};
  short ADCWert;
    ADC_Init();
  while(1)
  {
    ADCWert = ADC_Read(4);

    sprintf(String,"Test: %i\n", ADCWert);
    uart_puts(String);
    //USART_Transmit(S);
        _delay_ms(1000);
  }

}
Gast #4510173
Lesenswert?
• ▲
▼
Hans-Peter,

ist das ein atmega644 oder ein atmega644P ?

Bitte schaue ins Datenblatt und programmiere es herunter.
Ist ja alles 0-8-15.

Dort stehe sogar die Registernamen und deren zugehörige Bits.
Im Vergleich zurm atmega32 habe sich die Namen und die 
Hardware-Funktionen vervielfacht.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.