Forum: Mikrocontroller und Digitale Elektronik Pollin Controller Port Ausgang auf "high" schalten


von Fabian (Gast)


Lesenswert?

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

von Martin K. (maart)


Lesenswert?

1
 // PC0 auf 1 setzen
2
   PORTC |= ~(1<<PC0);
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)
1
// PC0 auf danach auf 0 setzen
2
   //PORTC |= (1<<PC0);
Nöö, die Anweisung ist ja auskommentiert ;-)

von Fabian (Gast)


Lesenswert?

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 :-)

von Martin K. (maart)


Lesenswert?

1
PORTC |= (1<<PC0); // einschalten
2
PORTC &= ~(1<<PC0); // ausschalten

von Fabian (Gast)


Lesenswert?

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

von Martin K. (maart)


Lesenswert?

Welches Board hast Du denn, und welcher AVR ist da drauf?

von Fabian (Gast)


Lesenswert?

ich besitze folgendes Board:
AVR NET IO mit einem ATMega32
siehe:
http://www.pollin.de/shop/downloads/D810058B.PDF

von Martin K. (maart)


Lesenswert?

Lustig, das habe ich gerade vor mir liegen.

PC0 liegt auf Pin 12 der LPT-Buchse.

von Fabian (Gast)


Lesenswert?

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

von Al3ko -. (al3ko)


Lesenswert?

Pin 2 ist schon richtig. Woher weißt du, dass der Pin low ist? Wie 
testest du das?

von Al3ko -. (al3ko)


Lesenswert?

Ach ja, schreib mal für DDRC:
1
DDRC |= (1<<PC0);

Gruß

von Martin K. (maart)


Angehängte Dateien:

Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

ich mess Pin2 gegen Masse

das erbrachte auch nicht den gewünschten Erfolg : DDRC |= (1<<PC0);
was bedeutet denn das?

von Al3ko -. (al3ko)


Lesenswert?

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 :)

von Martin K. (maart)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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;

}

von Martin K. (maart)


Lesenswert?

So sollte es funktionieren.
Kannst du prüfen, ob vom mega32-Pin 22 Kontakt zu der im Bild markierten 
Stelle besteht?

Sonst lade mal das Programm rein:
1
#include <avr/io.h>
2
3
int main (void) {
4
5
  // PC0 als Ausgang setzen
6
  DDRA  = (1<<PA4);
7
  PORTA |= (1<<PA4); // einschalten
8
  //PORTC &= ~(1<<PC0); // ausschalten
9
10
11
  while(1) {
12
    // Hier könnte noch mehr Quelltext stehen
13
14
  }
15
  return 0;
16
17
}

Auf der Schraubklemmenleiste sollte jetzt ADC1 auf 5 Volt liegen.

von Fabian (Gast)


Lesenswert?

Hallo nochmals,

irgendwie funktioniert das nicht.
könnten wir mal die Einstellungen vergleichen?
benutzt du auch Eclipse?

von Martin K. (maart)


Angehängte Dateien:

Lesenswert?

Nein, ich benutze das Atmel Studio 6.
Ich habe mal dieses Programm hier als HEX-Datei angehängt:
1
#include <avr/io.h>
2
3
int main (void) {
4
5
  
6
  DDRA  = (1<<PA4);
7
  DDRC = ( 1 << PC0);
8
  PORTA = (1<<PA4);
9
  PORTC = (1 << PC0);
10
  
11
12
13
  while(1) {
14
    asm("NOP");
15
16
  }
17
  
18
19
}

Lade es mal mit avrdude auf deinen mega32.
So können wir zumindest mal die Hardware testen.
(PC0 und ADC1 auf der Schraubklemme führen jetzt 5 Volt)

von Fabian (Gast)


Lesenswert?

kurze frage noch vorweg, wie hast du deine jumper gesetzt?
meine sind auf J4 = int u. AREF und J11 = normal

von Martin K. (maart)


Lesenswert?

Ja, meine stehen auch so.
J11 wird aber nur von der original Pollinsoftware ausgewertet.

von Fabian (Gast)


Lesenswert?

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.

von Martin K. (maart)


Lesenswert?

Dann hänge doch mal die Hex-Datei von dir an.

von Fabian (Gast)


Lesenswert?

bin nur Gast, kann ich da auch was hochladen?

von Martin K. (maart)


Lesenswert?

Keine Ahnung, sonst kopiere den Inhalt der Datei einfach hier rein, sind 
ja nur Buchstaben und Zahlen.

von Spess53 (Gast)


Lesenswert?

Hi

>bin nur Gast, kann ich da auch was hochladen?

Ja.

MfG Spess

von Fabian (Gast)


Lesenswert?

:100000000C942A000C9447000C9447000C94470071
:100010000C9447000C9447000C9447000C94470044
:100020000C9447000C9447000C9447000C94470034
:100030000C9447000C9447000C9447000C94470024
:100040000C9447000C9447000C9447000C94470014
:100050000C94470011241FBECFE5D8E0DEBFCDBF12
:1000600010E0A0E6B0E0E6E3F1E002C005900D92FA
:10007000A036B107D9F710E0A0E6B0E001C01D92AC
:10008000A036B107E1F70E9477000C9499000C9418
:100090000000DF93CF9300D000D000D0CDB7DEB703
:1000A0009E838D838D819E819C838B8313C083E38C
:1000B00090E09A83898305C089819A8101979A8308
:1000C000898389819A810097B9F78B819C810197F7
:1000D0009C838B838B819C81009749F726960FB672
:1000E000F894DEBF0FBECDBFCF91DF910895DF93AF
:1000F000CF93CDB7DEB7A1E3B0E0E1E3F0E08081DC
:1001000080648C93A2E3B0E0E2E3F0E0808180645D
:100110008C9388EE93E00E944900A2E3B0E0E2E312
:10012000F0E080818F7B8C9388E491E70E94490006
:06013000E9CFF894FFCFB7
:00000001FF

von Martin K. (maart)


Lesenswert?

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?

von Fabian (Gast)


Lesenswert?

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

von Martin K. (maart)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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

von Martin K. (maart)


Lesenswert?

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?

von Dietrich L. (dietrichl)


Lesenswert?

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

von Martin K. (maart)


Lesenswert?

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:
1
     #include <avr/io.h>
2
3
int main (void) {
4
5
6
  DDRA  = (1<<PA4);
7
  DDRC = ( 1 << PC0);
8
  PORTA = (1<<PA4);
9
  PORTC = (1 << PC0);
10
11
12
13
  while(1) {
14
    asm("NOP");
15
16
  }
17
18
19
}

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
Noch kein Account? Hier anmelden.