Hallo, ich mache gerade meine ersten Gehversuche mit einem DS18S20 und bin über das geniale Tutorial von B.v.B gestoßen. Damit sollten eigendlich schon alle Fragen aus der Welt sein, jedoch verstehe ich folgende Zeilen nicht: // Port-Pin zur Realisierung des 1-Wire-Busses unsigned char bit DQ @ 0xb4; // Port-Pin P3.4 = b4h // Port-Pin P4.0 = c0h Könnte mir mal jemand genau erklären was da passiert? Ein paar Fragen um meine Verwirrung zu erklären: 1. Wozu ist das '@' ? 2. Ist 'bit' evtl. eine Struktur? 3. Welche Adresse muss zugewiesen werden? (falls zB an PB1 angeschlossen muss dann PORTB verwendet werden? )
Um welchen Prozessor geht es hier? Normalerweise hängt dieser 1Wire-Bus an "einem Port-Pin". Bei Atmel prozi's z.B. Portb.1. Also einem von 8 möglichen bei einem 8 Bit-prozi. Was über diesen Port-Pin abläuft ist sowas wie eine serielle Bitfolge die über sogenannte Timeslots -Zeitscheiben- abgewickelt wird. Die Busteilnehmer warten auf ein Startsignal in dem Falle 1wreset und erwarten dann ein Komando oder eine Deviceadresse die sich angesprochen fühlen sollte, also dann ein Kommando erwartet. Du scheinst eine Bitzuweisung bei der Initialisierung mit einem Kommando zu verwechseln, habe ich den Eindruck. Kenne Progr-sprache C zu wenig.
> Könnte mir mal jemand genau erklären was da passiert? Das kein C sondern irgendein Herstellerdialekt. Keine Ahnung was fuer eine Sprache. So komisch wie das aussieht wuerde ich PIC vermuten. Dort wird eine Variable definiert die an einer bestimmten Stelle im Speicher liegt. Diese Stelle ist zufaellig ein PortPin. Dann kann man durch beschreiben dieser Variable mit dem Pin wackeln. Olaf
newbie schrieb: > Könnte mir mal jemand genau erklären was da passiert? steht auf der Homepage von B.v.B. http://www.bvb.de/
> unsigned char bit DQ @ 0xb4;
Das "unsigned char" versteh ich in diesem Kontext auch nicht.
Aber das "bit DQ @ 0xb4;" steht für eine Zuweisung der Adresse 0xb4 an
die "Bit-Variable" DQ.
Leider alles nicht richtig ! // Port-Pin zur Realisierung des 1-Wire-Busses unsigned char bit DQ @ 0xb4; // Port-Pin P3.4 = b4h // Port-Pin P4.0 = c0h Der Prozessor ist ein 8051er (hier der AT89C51CC03er von Atmel) und die Sprache ist C !! Jedoch gilt in C: die µC-spezifischen Besonderheiten z.B. beim Arbeiten mit SFRs und SFR-Bits sind leider nicht international genormt und jeder Compiler-Hesteller macht das hier anders !! Hier: Festlegungen für den Wickenhäuser C-Compiler µC/51: unsigned char bit ist die Def. einer Bit-Variablen, ganz genau: eines einzelnen Port-Pins, denn beim 8051er sind die Port-Pins bitadressierbar. DQ ist der symbolische Name des Port-Pins, hier der Datenbit-Pin für den 1-Wire-Bus und 0xb4 ist die interne Adresse dieses Port-Pins (des Port-Pins P3.4). Das @-Zeichen ist die Zuweisung: Name zur Adresse. Viele Grüße BvB
okay... ich dachte dieses Tutorial sei bekannter. Ist '@' denn ein Operator in C? (Bildungslücke?) Mal anders: wenn ich den Pin den ich benutzen möchte DQ nennen möchte, und dieser Pin PB1 an einem ATmega48 ist. Wie säh denn dann der Code aus? Also begriffen hab ich das so noch nicht, würde es aber gern verstehen.
Es scheint bei diesem angesprochenen C Compiler sowas zu sein. Du müsstest mal versuchen infos über diesen C Compiler zu bekommen um die Spezifikation verstehen zu können. Nur, du scheinst also einen Programmcode erwischt zu haben, der für deine Verwendung mit den dich interessierenden Atmegas unpassend zu sein scheint.
Moin, ich habe mir auch gerade eine 1-Wire Bibliothek für den DS18S20 geschrieben, ich mache es so:
1 | /*** Port mapping ***/
|
2 | /* One Wire Interface */
|
3 | #define K_PORT_OWI PORTD
|
4 | #define K_DDR_OWI DDRD
|
5 | #define K_PIN_OWI PIND
|
6 | #define K_PORTPIN_OWI 3
|
Zugreifen kann man dann so:
1 | K_PORT_OWI |= (1<<K_PORTPIN_OWI) //Out high oder In mit Pull-up aktiv |
2 | K_PORT_OWI &= ~(1<<K_PORTPIN_OWI) // ^das Gegenteil |
3 | K_DDR_OWI |= (1<<K_PORTPIN_OWI) //OWI Pin als Ausgang |
4 | K_DDR_OWI &= ~(1<<K_PORTPIN_OWI) //OWI PIN als Eingang |
Man kann dafür auch Makros definieren:
1 | /*** Makros ***/
|
2 | #define OWI_high() K_PORT_OWI |= (1<<K_PORTPIN_OWI) //Out high oder In mit Pull-up aktiv
|
3 | #define OWI_low() K_PORT_OWI &= ~(1<<K_PORTPIN_OWI) // ^das Gegenteil
|
4 | #define OWI_out() K_DDR_OWI |= (1<<K_PORTPIN_OWI) //OWI Pin als Ausgang
|
5 | #define OWI_in() K_DDR_OWI &= ~(1<<K_PORTPIN_OWI) //OWI PIN als Eingang
|
Gruß, Jan
Achso... Controller: ATmega8 Compiler: AVR-GCC unter Linux, geht aber auch mit dem winavr und AVR-Studio
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.