hallo zusammen,
ich habe mir ein Microcontroller Port von Pollin bestellt was auch sehr
gut funktioniert. Nun würde ich gerne die Ausgänge setzen wie im
folgenden Beispiele gezeigt
#include <avr/io.h>
int main (void) {
// PC0 als Ausgang setzen
DDRC = (1<<PC0);
// PC0 auf 1 setzen
PORTC |= ~(1<<PC0);
// PC0 auf danach auf 0 setzen
//PORTC |= (1<<PC0);
while(1) {
}
return 0;
}
nun wollte ich den Port wie folgt setzen. allerdings wird der Port nie
auf "1" gesetzt, kann mir jemand sagen was ich falsch mache?
vielen Dank
Hiermit werden alle Pins bis auf den P0 auf HIGH gesetzt, da sie
allerdings als Eingang konfiguriert sind: Es werden die Pull-Ups
eingeschaltet. (P0 bleibt null)
kannst du mir sagen, wie ich einen Ausgang auf "1" schalten kann?
bin totaler Anfänger und brauch ne kleine Starthilfe.
brauch solangsam mal ein Erfolgserlebnis :-)
muss ich irgendwo noch einen Jumper umsetzen?
hab es nun wie folgt programmiert:
#include <avr/io.h>
int main (void) {
// PC0 als Ausgang setzen
DDRC = (1<<PC0);
PORTC |= (1<<PC0); // einschalten
//PORTC &= ~(1<<PC0); // ausschalten
while(1) {
// Hier könnte noch mehr Quelltext stehen
}
return 0;
}
allerdings bekomm ich den Port nie auf "1"
muss ich es innerhalb von der while schleife machen? denke aber eher
nicht da dort oben der Port auf "1" gesetzt wird. die while - schleife
dient doch nur dazu dass das programm nicht wieder von vorne anfängt
oder nicht?
hab ich den Ausgang falsch deklariert? ich denke fast dass der Ausgang
als Eingang deklariert ist so wie ich das gelesen habe
warum Pin 12? Port PC0 geht doch auf Pin 2
wie programmierst du ihn, mit einem externen Programmer oder auch über
die ISP-Schnittstelle?
ich mach es mit Eclipse. es erscheinen auch keine Fehlermeldungen, dass
irgendwas nicht gehen sollte, siehe:
Launching /usr/bin/avrdude -pm32 -cavrisp2 -Pusb -Uflash:w:AVR.hex:a
Output:
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100%
0.00s
avrdude: Device signature = 0x1e9502
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be
performed
To disable this feature, specify the -D option.
avrdude: current erase-rewrite cycle count is -1062731686 (if being
tracked)
avrdude: erasing chip
avrdude: reading input file "AVR.hex"
avrdude: input file AVR.hex auto detected as Intel Hex
avrdude: writing flash (310 bytes):
Writing | ################################################## | 100%
0.11s
avrdude: 310 bytes of flash written
avrdude: verifying flash memory against AVR.hex:
avrdude: load data flash data from input file AVR.hex:
avrdude: input file AVR.hex auto detected as Intel Hex
avrdude: input file AVR.hex contains 310 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100%
0.09s
avrdude: verifying ...
avrdude: 310 bytes of flash verified
avrdude done. Thank you.
avrdude finished
Ich programmiere mit dem AVRISP mkII, ich musste mir noch extra einen
Adapter von 10 polig auf 6 polig löten.
Ich habe mal die Stelle markiert, auf die PC0 geht.
Fabian schrieb:> ich mess Pin2 gegen Masse>> das erbrachte auch nicht den gewünschten Erfolg : DDRC |= (1<<PC0);> was bedeutet denn das?
Miss doch mal direkt von PC0 nach Masse am uC.
Wenn du den AVRISP mkII mit dem Board verbindest, hast du die grüne LED
am AVRISP mkII leuchten? Oder leuchtet da irgendwas rot/orange?
Wobei, wenn du beim AVRISP mkII irgendwas verpolt hast, wirst du
sicherlich nicht erfolgreich mit avrdude flashen können :)
Alex A. schrieb:
>Ach ja, schreib mal für DDRC:>DDRC |= (1<<PC0);
So pauschal kann man das aber nicht sagen!
Fabian schrieb:
>das erbrachte auch nicht den gewünschten Erfolg : DDRC |= (1<<PC0);>was bedeutet denn das?
Der Inhalt des Registers "DDRC" wird gelesen und dann per ODER mit
00000001 verknüpft.
Vorteil: Es wird nur das "gewünschte" Bit verändert, alle anderen Bits
bleiben so wie sie sind.
Der Unterschied zu deinem Code:
Sollte z. B. der komplette Port irgendwann mal als Ausgang definiert
worden sein, so ist nach der Anweisung
1
DDRC=(1<<PC0)
wirklich nur PC0 als Ausgang eingestellt, der Rest ist jetzt als Engang
konfiguriert.
ok, hat leider nicht geklappt, werde aber nochmals alles durchgehen.
ich hoffe, dass das Programm so OK ist, dass ich dies wenigstens
ausschließen kann:
#include <avr/io.h>
int main (void) {
// PC0 als Ausgang setzen
DDRC = (1<<PC0);
PORTC |= (1<<PC0); // einschalten
//PORTC &= ~(1<<PC0); // ausschalten
while(1) {
// Hier könnte noch mehr Quelltext stehen
}
return 0;
}
ok, lade mir gerade das Atmel Studio 6 herunter.
Hardware kann ich fast ausschließen, da ich zwischenzeitlich ein zweites
angeschlossen habe, da treten aber die gleichen Probleme auf.
So, habe es mal im Disassembler angesehen:
Dein Programm macht alles, nur nichts auf einem Port ausgeben.
Bist Du sicher, dass du auch die richtige hex-Datei brennst?
so, habe nun das Atmel Studio 6 installiert.
musste gleich ein Firmware update von meinem Amtmel mk2 machen.
nachdem ich das Programm compiliert habe und auf den Microcontroller
geschoben, war zwar immer noch kein besseres Ergebnis da aber das jetzt
entstandene hex file sieht so aus:
:100000000C942A000C9447000C9447000C94470071
:100010000C9447000C9447000C9447000C94470044
:100020000C9447000C9447000C9447000C94470034
:100030000C9447000C9447000C9447000C94470024
:100040000C9447000C9447000C9447000C94470014
:100050000C94470011241FBECFE5D8E0DEBFCDBF12
:1000600010E0A0E6B0E0EEE9F0E002C005900D92ED
:10007000A036B107D9F710E0A0E6B0E001C01D92AC
:10008000A036B107E1F70E9449000C944D000C9492
:0E009000000080E18ABBDC9AFFCFF894FFCF1E
:00000001FF
Dieses Programm konfiguriert PA4 als Ausgang und gibt dann high-Pegel
aus.
Um es auch wirklich zu kontrollieren (ist ja schon spät) habe ich es
auch aufs NETIO gebrannt: Funktioniert.
Es gibt also mit deiner Hardware irgendwo Probleme.
kann es sein dass es was mit dem Bootloader etc zu tun hat?
vor ca 6Monaten hatte ich schon einmal an dem Port einen Ausgang auf "1"
gesetzt. ich geh jetzt mal davon aus, dass der Atmel mk2 funktioniert.
was anderes kann ich aus den Übertragungsmeldungen nicht heraus lesen.
Naja, werde es mir nach der Arbeit nochmals anschauen.
Hallo zusammen,
ich konnte nun den Ausgang mit diesem Beispiel auf "1" setzen.
#include <avr/io.h>
int main (void) {
DDRA = (1<<PA4);
DDRC = ( 1 << PC0);
PORTA = (1<<PA4);
PORTC = (1 << PC0);
while(1) {
asm("NOP");
}
}
leider hab ich nichts gemacht, nur das Programm nochmals auf den
Controller geschoben, wie gestern schon.
so, jetzt wollte ich de Port wieder auf "0" setzen was ich aber nicht
hinbekommen habe, jetzt kann es sein dass ich ein Fehler gemacht habe
oder aber das was mit meinem Programmer nicht stimmt, dass er einen
Macken hat etc...
so wollte ich den Port auf "0" setzen:
#include <avr/io.h>
int main (void) {
DDRA = (1<<PA4);
PORTA &= ~(1<<PA4); // ausschalten
while(1) {
asm("NOP");
}
}
kann mir jemand sagen ob ich was falsch mache oder ob mein Programmer
einen macken hat? vielen Dank
Die Programme sind soweit richtig.
Es stellt sich aber die Frage, welchen Portpin du jetzt genau
einschalten willst?
Im ersten Programm schaltest du PA4 und PC0 ein, im zweiten wird PA4
aktiv auf GND gelegt.
Wie misst du denn?
Martin Kreiner schrieb:> im zweiten wird PA4 aktiv auf GND gelegt.
... und PA4 geht lt. Schaltung auf die Klemme J9, Anschluss ADC1.
Achtung: "ADC1" nach Klemmenbezeichnung des Boards ist am Prozessor
Pin 36 = (ADC4)PA4.
Gruß Dietrich
Da das jetzt irgendwie nur noch rumstochern im Nebel ist, würde ich den
Fabian bitten: Lade das von dir hier eingestellte Programm, welches PA4
und PC0 einschaltet, auf den mega32. Dann schaust du im Datenblatt des
mega32 nach, welche entsprechenden Pins das sind. Dann misst du DIREKT
am Controllerpin die Spannung bezogen auf GND nach.
Ich meine dieses Programm: