Pollin Controller Port Ausgang auf "high" schalten

Gast #2873871
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
#2873880
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 ;-)
Gast #2873923
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
Gast #2873960
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
#2873992
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 :)
#2873993
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.
Gast #2874013
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;

}
#2874024
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.
#2874190
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)
Angehängte Dateien:
Gast #2874245
Lesenswert?

:100000000C942A000C9447000C9447000C94470071
:100010000C9447000C9447000C9447000C94470044
:100020000C9447000C9447000C9447000C94470034
:100030000C9447000C9447000C9447000C94470024
:100040000C9447000C9447000C9447000C94470014
:100050000C94470011241FBECFE5D8E0DEBFCDBF12
:1000600010E0A0E6B0E0E6E3F1E002C005900D92FA
:10007000A036B107D9F710E0A0E6B0E001C01D92AC
:10008000A036B107E1F70E9477000C9499000C9418
:100090000000DF93CF9300D000D000D0CDB7DEB703
:1000A0009E838D838D819E819C838B8313C083E38C
:1000B00090E09A83898305C089819A8101979A8308
:1000C000898389819A810097B9F78B819C810197F7
:1000D0009C838B838B819C81009749F726960FB672
:1000E000F894DEBF0FBECDBFCF91DF910895DF93AF
:1000F000CF93CDB7DEB7A1E3B0E0E1E3F0E08081DC
:1001000080648C93A2E3B0E0E2E3F0E0808180645D
:100110008C9388EE93E00E944900A2E3B0E0E2E312
:10012000F0E080818F7B8C9388E491E70E94490006
:06013000E9CFF894FFCFB7
:00000001FF
Gast #2874356
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
Gast #2874454
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.
Gast #2875580
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
#2876451
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren