- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Verhalten von AtMega128 an PortC

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240

    Verhalten von AtMega128 an PortC

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Aufschluss bringt das Datenblatt Seite 6

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Hey super!! Danke für die Klasse Erklärung!

    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):

    Code:
    #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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    Hallo

    Vielen Dank für die schnelle Hilfe! Ich hab meinen Code jetzt mal folgendermaßen geändert:
    Code:
    #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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    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

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.07.2006
    Ort
    nähe Rottweil
    Alter
    40
    Beiträge
    240
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen