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
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.
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
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ß
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
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
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
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
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.