PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verhalten von AtMega128 an PortC



Mr Bean
21.11.2007, 19:17
Hallo

Ich habe mir ein neues Experimentierboard mit dem Mega128 drauf gemacht. Bisher hatte ich eines mit dem Mega8. An dem Mega128 hab ich an PortC 8LED`s die mit einer logischen 0 eingeschalten werden.
Wenn der Controller jetzt im Urzustand ist, also nicht programmiert ist sind alle LED`s schon an. Wenn ich den Port nun softwaremäßig auf 1 stelle, gehen alle aus. Dieses Verhalten ist ja eigentlich OK. Wenn ich den Controller nun programmiere (während des Programmiervorgangs) gehen wieder alle LED`s an. Das ist ein Verhalten das ich beim Mega8 nicht hatte. Darum wollte ich mal nachfragen ob das normal ist.
Danke schon mal im Voraus an die Leute die sich mit dem Mega128 schon besser auskennen als ich...

Grüße!!!

Bean

Hubert.G
21.11.2007, 20:02
Aufschluss bringt das Datenblatt Seite 6

Mr Bean
21.11.2007, 21:19
Hey super!! Danke für die Klasse Erklärung! 8-[ O:)

Naja scheint ja alles I.O. zu sein. Ich hab jetzt noch ein Problem mit der seriellen Schnittstelle. Und zwar habe ich folgendes Programm geschrieben. (Das meiste hab ich aus dem Datenblatt):



#include <avr/io.h>
#define F_CPU 12000000L
#include <util/delay.h>


#define BAUD 19200L
#define MYUBRR F_CPU/16/BAUD-1

int main(void)
{

USART_Init(MYUBRR);


while (!(UCSRA & (1<<UDRE))) //warten bis Senden möglich
{
}


UDR = 'H'; //schreibt das Zeichen x auf die Schnittstelle
_delay_ms(100);
UDR = 'A';
_delay_ms(100);
UDR = 'L';
_delay_ms(100);
UDR = 'L'; //schreibt das Zeichen x auf die Schnittstelle
_delay_ms(100);
UDR = 'O';
_delay_ms(100);

return 0;
}

void USART_Init(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char) ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<USBS)|(3<<UCSZ0);
}


Leider funktioniert das nicht, ich bekomme folgende Fehlermeldungen:


../USART.c: In function 'main':
../USART.c:23: warning: implicit declaration of function 'USART_Init'
../USART.c:26: error: 'UCSRA' undeclared (first use in this function)
../USART.c:26: error: (Each undeclared identifier is reported only once
../USART.c:26: error: for each function it appears in.)
../USART.c:31: error: 'UDR' undeclared (first use in this function)
../USART.c: At top level:
../USART.c:46: warning: conflicting types for 'USART_Init'
../USART.c:23: warning: previous implicit declaration of 'USART_Init' was here
../USART.c: In function 'USART_Init':
../USART.c:47: error: 'UBRRH' undeclared (first use in this function)
../USART.c:48: error: 'UBRRL' undeclared (first use in this function)
../USART.c:49: error: 'UCSRB' undeclared (first use in this function)
../USART.c:50: error: 'UCSRC' undeclared (first use in this function)

kann mir da jemand weiter helfen? Und vielleicht auch mit einer kurzen Erklärung... Hab schon daran gedacht dass es daran liegt dass der Mega in dem Urzustand ja kompatibel zu dem anderen Prozessor ist, aber vielleicht wisst ihr ja mehr.

Vielen DAnk schon mal!

Grüße!!

Bean

gummi_ente
21.11.2007, 22:08
Hallo Bean,

erst einmal muß Du die Funktion USART_Init entweder oben deklarieren, oder direkt vor Main setzen,
ansonsten kennt der Compiler diese noch nicht wenn er auf den Aufruf stößt.

Dann, alle Register der USART's haben einen Index für den UART, entweder 0 oder 1, je nachdem welche der beiden Schnittstellen man nutzt.

Also statt:

UBRRH -> UBRR0H
UBRRL -> UBRR0L usw. siehe Handbuch.

Grüße

Mr Bean
21.11.2007, 22:49
Hallo

Vielen Dank für die schnelle Hilfe! Ich hab meinen Code jetzt mal folgendermaßen geändert:

#include <avr/io.h>
#define F_CPU 12000000L
#include <util/delay.h>


#define BAUD 19200L
#define MYUBRR F_CPU/16/BAUD-1


void USART_Init(unsigned int ubrr)
{
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char) ubrr;
UCSR0B = (1<<RXEN)|(1<<TXEN);
UCSR0C = (1<<USBS)|(3<<UCSZ0);
}




int main(void)
{

USART_Init(MYUBRR);


while (!(UCSR0A & (1<<UDRE0))) //warten bis Senden möglich
{
}


UDR0 = 'H'; //schreibt das Zeichen x auf die Schnittstelle
_delay_ms(100);
UDR0 = 'A';
_delay_ms(100);
UDR0 = 'L';
_delay_ms(100);
UDR0 = 'L'; //schreibt das Zeichen x auf die Schnittstelle
_delay_ms(100);
UDR0 = 'O';
_delay_ms(100);

return 0;
}




Empfange aber leider immernoch kein "HALLO" auf meinem HyperTerminal. Vielleicht habt ihr ja noch eine Idee, ich glaube ich geh jetzt erstmal ins Bett und schau mir das morgen noch einmal ausgeschlafen und in Ruhe an...

Vielen Dank nochmal!

Grüße!!

Bean

gummi_ente
22.11.2007, 06:36
Hallo Bean,

was mir noch auffällt:

UCSROC setzt Du auf 8Bit 2 Stopbits, ist das Absicht.

In der Regel arbeitet man mit 8N1, dann müßte UCSR0C = 0b00000110 sein.

Dann könntest Du nach der Init im HP schreiben:

loop_until_bit_is_set(UCSR0A, UDRE); // Wait UART ready
UDR0 = 'H'; // Send char
loop_until_bit_is_set(UCSR0A, UDRE); // Wait UART ready
...

By the way, wie ist den die Verbindung von Deinem Board zum PC, ist da noch ein RS232 Wandler (Max232 o.s.). Welches Kabel nutzt Du (Rxd,Txd vertauscht?).


Grüße

Mr Bean
22.11.2007, 08:53
Guten Morgen!

Ja einen MAX Pegelwandler hab ich noch drin, hab die Schnittstelle auch schon einmal mit einem Mega8 zum laufen bekommen. Einziger Unterschied ist dass ich jetzt SMD Kondensatoren für den Pegelwandler drauf hab. Könnte das ein Problem sein? Kabel ist soweit ich weiß ein 1zu1. Hat ja wie gesagt auch schon funktioniert mit dem Mega8.

Grüße!!

Bean