PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] ADC0/1 Eingänge umändern



wenckstar
01.05.2012, 11:41
Brauche auch Hilfe.

Ich habe vor die Eingänge ADC0/1 als Ausgänge zu beschalten, um etwas anzusteuern. Eine Logik Schaltung.
Was muss ich dort umschreiben? Weiß das jemand?

Vielen Dank.

Hier ist ein auszug aus der Base.h

#define UBAT (1 << PINA7) // ADC7 (Input)
#define MCURRENT_L (1 << PINA6) // ADC6 (Input)
#define MCURRENT_R (1 << PINA5) // ADC5 (Input)
#define E_INT1 (1 << PINA4) // INT1 (input per default... can be output)
#define LS_L (1 << PINA3) // ADC3 (Input)
#define LS_R (1 << PINA2) // ADC2 (Input)
#define ADC1 (1 << PINA1) // ADC1 (Input)
#define ADC0 (1 << PINA0) // ADC0 (Input)

// Initial value of port and direction registers.
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000

// ---------------------------------------------------
// PORTA A/D Convertor channels

#define ADC_BAT 7
#define ADC_MCURRENT_L 6
#define ADC_MCURRENT_R 5
#define ADC_LS_L 3
#define ADC_LS_R 2
#define ADC_ADC1 1
#define ADC_ADC0 0

Kampi
01.05.2012, 11:57
Damit:

#define ADC1 (1 << PINA1) // ADC1 (Input)
#define ADC0 (1 << PINA0) // ADC0 (Input)

wird gesagt das ADC0/1 dafür sorgt das eine 1 an die Stelle für PinA0 und A1 geschoben wird, damit der Pin als Eingang fungiert. Wenn du ihn als Ausgang haben möchtest muss an der Stelle eine 0 stehen.
Das heißt du könntest es so schreiben:

#define ADC0 (0 << PINA0)
#define ADC1 (0 << PINA1)

Das sollte so funktionieren.

RolfD
01.05.2012, 12:10
Ich hätte Wenkstar ja erst mal durch die Beispiele gescheucht statt ihm ne fertige Lösung zu präsentieren... vorgekaut lernt er weniger. Aber da gibts ja noch nen 2ten Post zum gleichen Thema.. vielleicht nutze ich den dafür. *lach
lg Rolf

Kampi
01.05.2012, 12:24
Ich hätte Wenkstar ja erst mal durch die Beispiele gescheucht statt ihm ne fertige Lösung zu präsentieren... vorgekaut lernt er weniger. Aber da gibts ja noch nen 2ten Post zum gleichen Thema.. vielleicht nutze ich den dafür. *lach
lg Rolf

Auch wieder wahr ;)

MagicWSmoke
01.05.2012, 12:31
#define ADC0 (0 << PINA0)
#define ADC1 (0 << PINA1)
Damit hebst Du die eindeutige Zuordnung eines Pins zu einer Definition auf. Du kannst eine 0 so oft schieben wie Du willst, das #define bleibt immer 0, Du hast damit also beide #defines auf 0 gesetzt.
Macht keinen Sinn, denn ein Setzen der Pins als Eingang würde so gemacht:

DDRA &= ~(ADC1 | ADC2);
Das geht nach Deinem Vorschlag nicht mehr.
Hier wird entschieden, über portInit(), ob der Pin beim Start Ein- oder Ausgang ist und welchen Zustand er hat:

#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000

wenckstar
01.05.2012, 15:48
Danke erstmal für die Kommentare.
Besonders an Robotik Einstein, von den hat man mal eine gute Antwort bekommen.

Ich wird das mal versuchen.

Schönen 1 Mai noch

Kampi
01.05.2012, 16:04
Damit hebst Du die eindeutige Zuordnung eines Pins zu einer Definition auf. Du kannst eine 0 so oft schieben wie Du willst, das #define bleibt immer 0, Du hast damit also beide #defines auf 0 gesetzt.
Macht keinen Sinn, denn ein Setzen der Pins als Eingang würde so gemacht:

DDRA &= ~(ADC1 | ADC2);
Das geht nach Deinem Vorschlag nicht mehr.
Hier wird entschieden, über portInit(), ob der Pin beim Start Ein- oder Ausgang ist und welchen Zustand er hat:

#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000

Danke für die Korrektur ;)
Klinkt einleuchtend ^.^

oberallgeier
01.05.2012, 18:21
... Hier wird entschieden ... ob der Pin beim Start Ein- oder Ausgang ist und welchen Zustand er hat:
#define INIT_DDRA 0b00000000
#define INIT_PRTA 0b00000000Das Datenrichtungsregister und die Portpins beim Start auf Null setzen? Das ist doch überflüssig. Im Nach-Reset-Zustand sind die Ports laut Datenblatt "tri-stated" , auch PUD ist auf Null, also sozuagen eine vollständige Nullnummer - ohne dass man (ich jedenfalls) irgendein Schnippelchen Code braucht. Welchen Grund haben dann diese zwei defines bzw. die Aussage " ... hier wird entschieden ... ob der Pin beim Start ..."?

MagicWSmoke
01.05.2012, 18:33
Das Datenrichtungsregister und die Portpins beim Start auf Null setzen?
Die sind halt in der Standardkonfiguration auf 0, das bedeutet ja nicht, dass der Programmierer das so zu lassen hat.

Das ist doch überflüssig. Im Nach-Reset-Zustand sind die Ports laut Datenblatt "tri-stated" , auch PUD ist auf Null, also sozuagen eine vollständige Nullnummer - ohne dass man (ich jedenfalls) irgendein Schnippelchen Code braucht.
Ja, ist bekannt. Vor meiner Nachricht hatte ich mir die zugehörigen .c und .h des Projekts angesehen, hättest Du das auch, wäre Dir klar warum Dein Post daneben ging.

Welchen Grund haben dann diese zwei defines bzw. die Aussage " ... hier wird entschieden ... ob der Pin beim Start ..."?
Das sind Definitionen die vom Makro portInit() verwendet werden, um die Ports in den vom User gewünschten Anfangszustand zu versetzen.

wenckstar
01.05.2012, 19:57
Das hört sich ja alles gut an.

Vielleicht könnte mir noch jemand sagen wie ich den Port ADC0 in der Programmierung eine 1 verpasse. Laut Euren Aussagen ist er auf 0 geschaltet.

Das wäre noch sehr hiflreich.

Kampi
01.05.2012, 20:01
Jeder I/O Pin wird durch zwei Register gesteuert. Das erste Register (Data Direction Register - DDR) bestimmt wie welcher Pin geschaltet ist (Eingang oder Ausgang). Das andere Register regelt dann den logischen Zustand des Registers, sprich wenn du da eine 1 rein schreibst ist der dementsprechende Pin auch 1.

wenckstar
05.05.2012, 06:21
So das ist ja echt einfach.

AVR I O includen.
Dann in der Main void die ports beschalten.