Forum

Einloggen | Registrieren | RSS  

stefan b.(R)

22.09.2009,
09:00
 

C-Programm für Atmel90CAN128 (Elektronik)

Hallo,
für ein Projekt sollen wir den Atmel90CAN128 benutzen. Bisher haben wir in der Schule nur mit C++ programmiert und damit auch keine Microcontroller.
Das folgende kleine testprogramm funktioniert, also Verbindung aufbauen und Microcontroller beschreiben funtioniert:

Das Programm schaltet abwechselnd in der eingestellten Zeit entweder von PortF ADC0 und ADC2 oder ADC1 und ADC3.

#include <avr/io.h> // wird gesagt das wir I/O benutzen wollen
#include <until/delay.h> // wirdgesagt das wir Delays benutzen wollen

Int main (void) // Hauptprogramm
{
Int x; // Variable X wird deklariert

DDRF = 0xff; // im Port F werden alle Pins auf Ausgang
gesetzt
While(1)
{
PORTF = 0x00; // hiermit setzen wir den Ausgang Pin 0
auf 1
PORTF = (1<<0) | (1<<2); // hiermit wird Pin0 und 2
auf 1 gesetzt

X = 0; // hiermit wird x auf 0 gesetzt
While (x<20) // bleib in der Schleife solange x
kleiner 20
{
_delay_ms(16); // Verzögerung 16 ms
X++; // zähle 1 zu x dazu
} // wenn x = 20 gehe in folgenden schritt
PORTF = 0x00; // hiermit setzen wir den Ausgang
Pin0 auf 1
PORTF = (1<<1) | (1<<3); // hiermit wird Pin1 und 3
auf 1 gesetzt

X = 0; // hiermit wird x auf 0 gesetzt
While (x<20) // bleib in der Schleife solange x
kleiner 20
{
_delay_ms(16); //Verzögerung 20ms
X++; // zähle 1 zu x dazu
}
}
}
Also wir benutzen ein fertiges Board von Alvidi. Dort sind an den Ausgänge von PortF ADC0-ADC3 4LEDs und wir haben an PortE PE0-PE2 3 Schalter angeschlossen. Wir bekommen es aber nicht hin diese einzubinden.
Kann mir jemand helfen wie ich es programmieren muß, dass Schalter 1 die erste LED anschaltet, Schalter 2 die zweite und der dritte Schalter die 3 LED? Und wie wir unser Beispielprogramm so umschreiben, dass der Wechsel nur aktiv ist, wenn Schalter 1 z.B. eingeschlatet ist.
Schonmal Danke für die Hilfe!

Torsten(R)

E-Mail

22.09.2009,
09:41
(editiert von Torsten
am 22.09.2009 um 11:01)


@ stefan b.

C-Programm für Atmel90CAN128

» Dort sind an den Ausgänge
» von PortF ADC0-ADC3 4LEDs und wir haben an PortE PE0-PE2 3 Schalter
» angeschlossen. Wir bekommen es aber nicht hin diese einzubinden.
» Kann mir jemand helfen wie ich es programmieren muß, dass Schalter 1 die
» erste LED anschaltet, Schalter 2 die zweite und der dritte Schalter die 3
» LED?

Das Abfragen der Schalter funktioniert fast genau so, wie das Ansteuern der LEDs.
Als erstes müsst ihr die drei Pins an denen die Schalter hängen als Eingänge definieren. Das erfolgt über das Register DDRE. Die entsprechenden Bits sind auf 0 zu setzen.
Jetzt könnt ihr über PORTE den Status der Schalter abfragen. Wenn ihr an einer Programmstelle warten wollt, bis euer Taster gedrückt wurde, dann müsst ihr - etwas abstrakt formuliert - eine Abfrage der Form
while (Keine_Taste_gedrückt) {Leere_Anweisung}
verwenden.
Dazu müsst ihr aber den Hardwareaufbau kennen. Üblich ist das verwenden von Pullup Widerständen und das Schalten der Taster gegen GND. Das heißt, ein 0 Pegel signalisiert einen gedrückten Taster. Man kann es natürlich auch andersrum aufbauen. Also guckt erstmal nach, wie das bei euch gemacht wurde.

Das verwenden einer Endlosschleife zum Warten ist übrigens eine relativ schlechte Lösung, weil unnötig viel Rechenzeit verbraucht wird und das System in der Zwischenzeit nicht auf Anfragen reagieren kann. Aber es ist relativ einfach umzusetzen ud in eurem Fall vermutlich auch die gewünschte Lösung.
Falls ihr später mal Taster auch zum hochzählen von Zählern verwenden wollt, solltet ihr euch vorher unbedingt in das Entprellen von Tastern einlesen.

Mal was anderes zu den Kommentaren: Sind diese absolut sinnlosen Einzelzeilenkommentare Vorgabe des Lehrers?
Normalerweise fasst man mehrere Zeilen, die auch logisch im Programm zusammengehören, zu einem Block zusammen und beschreibt, was der Block macht und ggf. warum das an der Stelle erforderlich ist.
Hinter eine Zeile wie x++ noch zu schreiben, dass x um 1 erhöht wird, ist absolut unnötig, da es schon im Befehl ersichtlich ist. Interessant ist doch eher die Frage, warum x gerade an dieser Stelle um eins erhöht wird und was es im Zusammenhang bewirkt.

» PORTF = 0x00; // hiermit setzen wir den Ausgang Pin 0
» auf 1

Der Kommentar ist schlichtweg falsch.


Gruß
Torsten

geralds(R)

Homepage E-Mail

Wien, AT,
22.09.2009,
09:44

@ stefan b.

C-Programm für Atmel90CAN128

» Hallo,
» für ein Projekt sollen wir den Atmel90CAN128 benutzen. Bisher haben wir in
» der Schule nur mit C++ programmiert und damit auch keine Microcontroller.
» Das folgende kleine testprogramm funktioniert, also Verbindung aufbauen
» und Microcontroller beschreiben funtioniert:
»
» Das Programm schaltet abwechselnd in der eingestellten Zeit entweder von
» PortF ADC0 und ADC2 oder ADC1 und ADC3.
»
» #include <avr/io.h> // wird gesagt das wir I/O benutzen wollen
» #include <until/delay.h> // wirdgesagt das wir Delays benutzen wollen
»
» Int main (void) // Hauptprogramm
» {
» Int x; // Variable X wird deklariert
»
» DDRF = 0xff; // im Port F werden alle Pins auf Ausgang
» gesetzt
» While(1)
» {
» PORTF = 0x00; // hiermit setzen wir den Ausgang Pin 0
» auf 1
» PORTF = (1<<0) | (1<<2); // hiermit wird Pin0 und 2
» auf 1 gesetzt
»
» X = 0; // hiermit wird x auf 0 gesetzt
» While (x<20) // bleib in der Schleife solange x
» kleiner 20
» {
» _delay_ms(16); // Verzögerung 16 ms
» X++; // zähle 1 zu x dazu
» } // wenn x = 20 gehe in folgenden schritt
» PORTF = 0x00; // hiermit setzen wir den Ausgang
» Pin0 auf 1
» PORTF = (1<<1) | (1<<3); // hiermit wird Pin1 und 3
» auf 1 gesetzt
»
» X = 0; // hiermit wird x auf 0 gesetzt
» While (x<20) // bleib in der Schleife solange x
» kleiner 20
» {
» _delay_ms(16); //Verzögerung 20ms
» X++; // zähle 1 zu x dazu
» }
» }
» }
» Also wir benutzen ein fertiges Board von Alvidi. Dort sind an den Ausgänge
» von PortF ADC0-ADC3 4LEDs und wir haben an PortE PE0-PE2 3 Schalter
» angeschlossen. Wir bekommen es aber nicht hin diese einzubinden.
» Kann mir jemand helfen wie ich es programmieren muß, dass Schalter 1 die
» erste LED anschaltet, Schalter 2 die zweite und der dritte Schalter die 3
» LED? Und wie wir unser Beispielprogramm so umschreiben, dass der Wechsel
» nur aktiv ist, wenn Schalter 1 z.B. eingeschlatet ist.
» Schonmal Danke für die Hilfe!

--
Hallo Stefan,

Schau mal im Handbuch nach unter "case".

Was hältst davon?
Mache "Routineboxen" mit der Abfrage

case1 -> Taste1
case2 -> ...
default ->...
...

http://www.elektronik-kompendium.de/forum/upload/20090922094010.doc
(Quelle: www.mikrocontroller.net)

Im Dok sind mehrere Beispiele über Verzweigungen, auch case.

Im Handbuch vom AVR hast es gut beschrieben.

Da findest auch Schritt für Schritt Hilfen.
www.mikrocontroller.net


Grüße
Gerald

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

stefan b.(R)

22.09.2009,
10:37

@ geralds

C-Programm für Atmel90CAN128

Danke schon mal für die hilfe

noch eine Frage

Müssen wir dem Microcontroller sagen, dass er die Eingänge hat oder reicht es einfach, wenn wir, wie oben die Ausgänge DDRF = 0xff nennen?
Für die Eingänge dann DDRE = 0x00.

geralds(R)

Homepage E-Mail

Wien, AT,
22.09.2009,
11:05

@ stefan b.

C-Programm für Atmel90CAN128

» Danke schon mal für die hilfe
»
» noch eine Frage
»
» Müssen wir dem Microcontroller sagen, dass er die Eingänge hat oder reicht
» es einfach, wenn wir, wie oben die Ausgänge DDRF = 0xff nennen?
» Für die Eingänge dann DDRE = 0x00.

---
Das muss vorher dem Prozessor bekannt gemacht werden,
welcher Pin Ausgang ist, welcher Eingang.
Die Pins kannst einzeln konfigurieren durch Eingabe der Bit-Zahl.
Ich mache das in Form von binär - bit weise.
In hex wie du es andeutest geht auch, musst aber "rechnen".
in binär stellst einfach die 1 und 0 nebeneinander, um zu befehlen, was In oder Out ist.

---Beispiel mit einem PIC -- in ASM -- (leider stimmt hier der Tab-schritt nicht, aber das kannst sicher nachvollziehen)

; STATUS Register prüfen, ob vom Sleep Mode (Schlafmodus) oder von anderen Bedingungen
; ein Reset erfolgt.
;
movf.......STATUS, w ; hole Status ins Arbeitsregister und maskiere mit AND
andlw......b'11111000' ;
........; | | | | | | | | ______ C; R/W-x; Carry / #borrow bit; for ADDWF, SUBWF, RRF, RLF instr.;
........; | | | | | | | _______ DC; R/W-x; Digit Carry / #borrow bit; for ADDWF, SUBWF instr.;
........; | | | | | | ________ Z; R/W-x; Zero bit; -1- result of an arithm. or logic oper. is zero; -0- not zero;
........; | | | | | _________ #PD; R-1; Power-down bit; -1- after power-up or CLRWDT instr.; -0- by SLEEP instr;
........; | | | | __________ #TO; R-1; Time-out bit; -1- after power-up or CLRWDT or SLEEP instr.; -0- a WDT time-out;
........; | | | ___________ -res-; R/W-0;
........; | | ____________ -res-; R/W-0;
........; | _____________ GPUWF; R/W-0; -1- Reset due to wake up from Sleep on pin Change
........; ; -0- After power up or other Reset

---->

Ganz kurz zur Vorbereitung:
Im Compiler - Editor gibt es bei der Projekt Erstellung eine Unterstützung,
wo du angeben kannst welche Funktion der Chip als Grundeinstellung hat.
- also nach dem Reset.
Dann während den Arbeiten kommt es ja auch vor, dass das
entsprechende Port u.U. umgeschaltet werden muss.
Dann muss es, bevor die eigentliche Arbeit durchgeführt wird umgeschaltet werden,
und nach der Arbeit wieder zurück geschaltet werden.
Am besten gleich in der selben Unterroutine, bzw. wo du so
etwas bereits als Makro fertig hast nur zum Anspringen.

zB 1. Port-Pin ist Ausgang; 2. Port-Pin ist ADC
- aber! ADC ist ein Eingang, jedoch kein digitaler Eingang!
Und das muss dem Controller gesagt werden.

Im Controller Handbuch - nicht Datenblatt - steht es, wie man das macht.

Viel Spass mit dem Projekt.

Grüße
Gerald

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

ollanner(R)

22.09.2009,
19:39

@ geralds

Hinweis: Programmcodes Posten

Für den Fall, dass man mal Programmcodes posten möchte, bei dem die Formatierungen erhalten bleiben sollen und auch noch ein Syntax-Highlighting stattfinden soll, damit andere das besser lesen können:
http://pastie.org/
Da gehts am geschicktesten.
Link zum Paste denn hier rein.

--
Gruß
Der Ollanner