www.mikrocontroller.net

Forum: GCC ATmega32 UART sendet keine Daten


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: M. H. (dbzwerg)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo!

Habe bisher mit einem mega8 experimentiert und möchte nun einen mega32 
einsetzen.

Ein kleines Testprogramm läuft( die Leds blinken wie sie sollen), 
allerdings sendet der controller auf der uart keinen Text.

Der gleiche Code auf einem mega8 läuft. Pin unterschiede konnte ich( 
zumindest die von mir verwendeten) nicht finden und jtag ist 
deaktiviert.

Schaut mal bitte drüber wo bei mir der Fehler steckt. Im Anhang meine 
Fusebits einstellung

MFG

 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Hauptprogramm für den ClockClock Master

// µC :ATmega32

// CPU Takt : 16MHz

// Funktionsbeschreibung:

//------------------------------

// Version: V0.1
// Datum: 07.08.12



//------------------------------

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include <avr/io.h>
#include <avr/interrupt.h> 
#include "uart.h" //Enthällt uart funktionen (Achtung uart.c muss in makefile eingetragen werden, wenn dies nicht von der ide gemacht wird)
#include <stdlib.h> // enthällt die Umwandlung von int zu char (itoa)
#include <util/delay.h> // Enthällt delay funktionen
#include <avr/wdt.h>  // Enthält Watchdog Funktionen

// Definitionen

  #ifndef F_CPU
  #define F_CPU         8000000UL  // CPU Takt in Hz
  #endif
  #define UART_BAUD_RATE    9600  


//Deklaration der Variablen

  volatile unsigned char count_100ms       =   0;
  volatile unsigned char count_500ms       =    0;
  volatile unsigned char count_1s       =    0;  
  volatile unsigned char timestamp       =   0;     // Zeitstempel byte
  //( Bit3 = 100ms; Bit4 =  500ms; Bit5= 1s) 
                                

//Deklaration der Funktionsprototypen

  void send_int_uart(int value); // Deklaration für UART INt SEND Unterfunktion

//Interrupts


// Aktion bei Timer 1 Overflow (alle 100ms)
ISR (TIMER1_OVF_vect)
{
  ++count_100ms;      // Intervallzähler inkrementieren
  TCNT1 = 53036; // Timer1 vorladen damit er  nach 100ms überläuft
}

// Hauptschleife
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
  int main (void) // Start Hauptschleife
  {
  
    // Eingänge definieren
    


    // Ausgänge definieren
      DDRD |=(1<< PD1);       //UART Tx
      DDRD |=(1<< PD5);       //Test Led1
      DDRD |=(1<< PD6);       //Test Led2
    
    // UART initialisieren

      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );   

    
      // Startkonfig Timer 1 
  
        TCCR1B |= (1<<CS10);   // Prescaler /64 = Overflow alle 100ms und Timer starten
        TCCR1B |= (1<<CS11);   //
        
        TIMSK |= (1<<TOIE1);   // Overlfow ISR erlauben

        
        TCNT1 = 53036;      // TImer1 vorladen damit er  nach 100ms überläuft
    
    // Global Interrupts aktivieren
      sei();  

      

  while(1)  // Start Dauerschleife
  {
      
    //Zeit setzen
      if ( count_100ms == 1) // 100ms
        {
          timestamp |= ((1 << 3));
          ++count_500ms;
          count_100ms = 0;
        }

      if ( count_500ms == 5) // 500ms
        {
          timestamp |= ((1 << 4));
          ++count_1s;
          count_500ms = 0;
        }

      if ( count_1s ==2) // 1s
        {
          timestamp |= ((1 << 5));
          count_1s = 0;
        }
  
//Zeitgesteuerte Aktionen
    
  //100ms
    if ((timestamp & (1<<3))) 
    {
      
      timestamp &= ~((1 << 3)); // Zetistempelbit 100ms löschen
    }

  //500ms
    if ((timestamp & (1<<4)))   
    {
      
      timestamp &= ~((1 << 4)); // Zetistempelbit 500ms löschen
    }
  //1s
    if ((timestamp & (1<<5))) 
    {
      PORTD ^= (1 << PD5 ); // Test Led 1 toggeln
      uart_puts("Test");
      timestamp &= ~((1 << 5)); // Zetistempelbit 1s löschen  
    }
  }//Ende Dauerschleife
  }//Ende Hauptschleife

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//Unterfunktion Integerwert über uart ausgeben
  void send_int_uart(int value)
  {
    char buffer [33];
    itoa (value,buffer,10);
    uart_puts(buffer);
  }


Autor: M. H. (dbzwerg)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Klein Ergänzung:

Bitte nicht an den 16 MHz in der Prog. beschreibung stören, er läuft 
definitv auf 8 Mhz, war einfach ein Tippfehler...

Hofe jemand findet meinen Fehler...

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wie wärs erst mal mit einem Einfachst-Testprogramm?
Damit kann man sich erst mal auf die UART und NUR auf die UART 
konzentrieren und muss nicht nachsehen, ob bei deiner Timerbehanndlung 
irgendwas im Argen liegt.

Irgendwas in der Form
#include <avr/io.h>
#include "uart.h"

#define F_CPU         8000000UL  // CPU Takt in Hz
#define UART_BAUD_RATE    9600  

int main (void)
{
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );   

  while( 1 )
    uart_putc( 'x' );
}

Wenn das nicht auf Anhieb funktioniert, kann man dann mal hergehen und 
am Tx Pin vom Mega messen (zb einfach mit einer LED), ob da was 
rauskommt (LED flackert). Das kann man dann auf der Platine verfolgen, 
über den MAX232 (so vorhanden), bis zum Kabel, über das Kabel bis zum PC 
und dort muss das Signal am Rx Pin der Seriellen immer noch anliegen.


Grundsatz:
Wenn du Fehler suchst, ganz speziell dann, wenn du ein System das erste 
mal in Betrieb nimmst, dann benutze das EINFACHST MÖGLICHE Testprogramm. 
Das kann gar nicht einfach genug sein! Denn Fehler macht man immer 
wieder mal. Daher möchte man jede wie auch immer geartete Möglichkeit 
für Rundherumfehler von vorne herein ausschliessen, damit man sich 
komplett auf dieses eine interessierende System konzentrieren kann.

Autor: M. H. (dbzwerg)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
So hab jetzt ein wenig rumprobiert... Nach langem hin und her hab ich 
nun Daten gesendet bekommen, allerdings nur wenn ich meinen seriellen 
Port auf 19200 statt der in prog. Definierten 9600 stelle ... Kann mir 
das jemand erklären?


Als Terminal nutze ich Putty auf einem win7/64Bit pc, die serielle ist 
ein USB Adapter mit ftdi Chip .

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net