PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Welches Register muss ich auf welchen Wert setzen?



jagdfalke
23.11.2005, 10:54
Hi,
ich hab gerade die Doku des rnbfra 1.1 und die vom atmega32 vor mir liegen. Ich will herausfinden, was ich machen muss, damit eines der 4 LEDs auf dem Board leuchtet. Ich bin allerdings leicht ratlos. Man müsste dazu doch herausfinden, wie die LEDs an den atmega32 angeschlossen sind und dann welches Register für diesen Anschluss verantwortlich ist. Stelle ich mir das so richtig vor?
Das Problem ist eben, dass ich keine Informationen darüber habe / finde wo die angeschlossen sind.
Wäre nett, wenn mir da jemand helfen kann, dann schaff ich das in Zukunft vielleicht / hoffentlich alleine.

mfg
jagdfalke

Andun
23.11.2005, 12:27
Also ich hab das Board zwar nicht, aber ich geh doch mal stark davon aus, dass es dazu einen Schaltplan gibt. Du musst einfach schauen an welchem Port und welchem Pin die LED angeschloßen ist und das kannst du dann ansprechen.

askazo
23.11.2005, 12:40
Wenn Du keinen Schaltplan finden solltest, kannst Du auch relativ leicht ausprobieren, auf welchem Port die LEDs sind.

Einfach ein kleines Programm schreiben:



#include <avr/io.h>

int main(void)
{
//erst mal alle PORTS als Ausgänge definieren
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;

//jetzt bei einem einzelnen Port alle Ausgänge auf 1 schalten
//alle anderen bleiben aus
PORTA = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;

while(1)
{
}

}



Jetzt mußt Du einfach 4 Mal das programm in den AVR laden. nach jedem mal setzt Du ein anderes PORT-Register auf 0xFF. Wenn die LEDs leuchten, hast Du das richtige Register erwischt.

Es kann natürlich auch sein, dass die LEDs mit Low-Pegel eingeschaltet werden. Dann musst Du einfach darauf achten, wann die LEDs ausgehen...

Um Vernünftig mit dem Board zu arbeiten, ist allerdings eine Schaltplan beinahe lebenswichtig....

askazo

PicNick
23.11.2005, 12:41
So einfach isses nicht, der Schaltplan ist doch einigermassen komplex.
Am besten gehst du mit den Beispielprogrammen vor. Da werden die einzelnen Komponenten in Betrieb genommen und da kann man am effektivsten erkennen, an welchen Strippen man jeweils ziehen muß

askazo
23.11.2005, 12:45
Warum ist's nicht so einfach? So komplex kann der Schaltplan nicht sein, dass man die LEDs darauf nicht bis zum Port zurückverfolgen könnte...

Wenn's Beispielprogramme für das Board gibt - umso besser. Damit kann man am einfachsten rausfinden, was wo ist.

jagdfalke
23.11.2005, 16:20
Also das Testprogramm hat keinen Einfluss auf die LEDs. Die haben die ganze Zeit geleuchtet, egal was ich gemacht habe.
Hier ist ein Beispielprogramm in Bascom aus dem ich habe nix rauslesen kann:


'################################################# ##
'Testprogramm 1
'fr
'RoboterNetz Standard-Roboter Board RBNFRA 1.1
'
'Aufgabe:
'Ausgabe ber PowerPort per I2C testen indem
'die vier Leds im lauflichtartig leuchten
'
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de
'################################################# ##


Const Writepowerport_adr = &H72 'I2C Adr PCF 2
Const Readpowerport_adr = &H73 'I2C Adr PCF 2

Dim I2cdaten As Byte 'Datenbyte aus PCF8574


Dim I As Byte

$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1

I2cinit

I = 0
I2cdaten = 1
Do
I2cdaten = I2cdaten * 2
If I2cdaten > 16 Then I2cdaten = 1

I2cstart
I2cwbyte Writepowerport_adr 'Schreibbefehl an PCF schicken
I2cwbyte I2cdaten 'Datenbyte an PCF
I2cstop
Incr I
Waitms 100
Loop




End


Mit diesem Schaltplan komm ich irgendwie nicht klar. Ich finde nicht mal den Hauptprozessor ](*,) ](*,) ](*,)

Noch ne Frage zum Code:
Du sagst "alle Ports aus Ausgänge definieren" und schreibst z.B."DDRA = 0xFF;". Dann sollen wieder einzelne Ports auf 1 geschaltet werden. Dieses Mal ist ein Port aber "PORTA". Wie kommt man denn von "DDRA" auf "PORTA" ??? Du schreibst halt beide Male "Port", des iritiert mich irgendwie.

mfg
jagdfalke

askazo
23.11.2005, 16:48
Hm, wenn Du mir mal den Schaltplan zukommen lassen könntest, könnte ich vielleicht weiterhelfen. Im Bascom-Beispiel werden die LEDs per I2C-Bus angesprochen, aber das ist eigentlich schon wieder einen Schritt zu weit für den Anfang.

Zu den Registern: Zu jedem Port gehören 3 8-Bit-Register. Jedes Bit steht für einen Pin des Ports.

DDR: (Data Direction Register) Hier bestimmst Du, ob ein Pin als Eingang oder als Ausgang konfiguriert wird. Setzt Du ein Bit auf 1, ist der zugehörige Pin als Ausgang konfiguriert. Setzt Du ihn auf 0, ist's ein Eingang.

PORT: Dieses Register hat nur Auswirkungen auf die als Ausgang konfigurierten Pins. Schreibst Du eine 1 in ein Bit, führt der dazugehörige Ausgang logisch 1 (5V). Schreibst Du eine 0 rein, hat er logisch 0 (0V).

PIN: (Port In) Dieses Register dient zum Einlesen der als Eingang konfigurierten Pins. Legst Du 5V an einen Eingang, steht in dem zum Eingang gehörenden Bit eine 1. Legst Du 0V an, steht eine 0 drin.

askazo

jagdfalke
23.11.2005, 16:56
Ahja, so langsam kommt etwas Klarheit in die Sache rein.

Der Schaltplan ist als Attachment angehängt.

mfg
jagdfalke

askazo
24.11.2005, 10:54
Hm, die LEDs können auf dem Bord tatsächlich nur über I2C-Bus angesteuert werden. Da ich mit I2C noch nicht gearbeitet habe, kann ich Dir da aus dem Stehgreif leider auch nicht weiterhelfen. Aber es gibt sicher genug Leute hier, die sich damit auskennen.

PS: Der Hauptprozessor ist auf dem Schaltplan gleich unter dem Coprozessor...

askazo

jagdfalke
24.11.2005, 16:49
Danke für deine Mühe askazo. Dann warte ich mal auf andere Beiträge darüber.

Aber wenn I2C am Anfang zu schwer ist, mit was soll ich denn dann mal anfangen? Ich mein LEDs sind ja jetzt nicht gerade sehr anspruchsvoll. Auf welche Pins wirkt sich denn dein Code von oben überhaupt aus?

zum Schaltplan:
Yeah, ich hab den Controller jetzt auch gefunden :D
Schau dir mal PD0 und PD1 an. Da steht dich RX und TX daneben. Haben die nix mit Uart zu tun? Oder hat UDR aus deinem Code garnix damit zu tun?

mfg
jagdfalke

askazo
24.11.2005, 17:18
Der Code von oben wirkt sich im Prinzip auf alle Prozessorpins aus, ehergesagt auf alle Port-Pins. Also alles, was im Schaltplan auf der rechten Seite des Prozessorsymbols liegt. Die Pins sind aber, wie Du an den in Klammern stehenden Sachen sehen kannst, doppelt belegt. Du kannst also jeden Pin als I/O verwenden, oder aber Du nutzt die Altenativ-Funktion, die in Klammern steht (ADC, I2C-Bus, UART...)

PD0 und PD1 sind übrigens die UART.
Sobald Du die über das entsprechende Register (UCSRB) die Uart einschaltest, fallen PD0 und PD1 als I/O-Pins weg und funktionieren als RxD und TxD.

askazo

jagdfalke
24.11.2005, 17:36
Also SDA und SCL wäre z.B. Ports für den I2C-Bus, wenn ich das entsprechende Register einschalte. Richtig?

Was ist dass dieses UDR, an das man das Zeichen übergibt? Auch wieder ein Register, ok, aber wie steht das in Verbindung mit TX am Prozessor? Das gleiche?

mfg
jagdfalke

askazo
24.11.2005, 18:49
Ja, genau richtig. So funktioniert das mit den alternativen Funktionen.

Das UDR Register ist das Datenregister für die UART. Wenn Du Daten senden willst, schreibst Du sie dort hinein. Wenn Du welche empfängst, stehen die empfangenen Daten in diesem Register zum Auslesen bereit.

askazo

jagdfalke
24.11.2005, 19:54
Also sind diese 2 Pins zwar schon für den Datentransfer zuständig, werden aber vom Programmierer nicht direkt angesprochen um was zu senden bzw zu empfangen. Das macht der Prozessor dan selber, ja?
Lassen sich die Bits für RX und TX eigentlich noch manuell setzten wenn UART aktiviert wird? Falls nein, was macht er dann, gibts ne Fehlermeldung o.ä. ?

mfg
jagdfalke

askazo
24.11.2005, 21:42
Ja, den Datentransfer organisiert der Prozessor selber.
RxD und TxD lassen sich nicht manuell setzten, wenn die UART eingeschaltet ist. Du kannst zwar das PORT-Register beschreiben, aber für die beiden UART-Pins wird das einfach ignoriert.

askazo