Datum:
Angehängte Dateien: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); } |
Datum:
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...
Datum:
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.
Datum:
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 .
