Forum: Mikrocontroller und Digitale Elektronik Atmega8 PB7 als Ausgang für Relais


von Christian P. (peterfrosta)


Angehängte Dateien:

Lesenswert?

Hallo ihr Alle,

ich habe ein Problem, was nicht neu zu sein scheint.

Ich habe gestern meine entworfenen Platinen bekommen.
Als ich die Ports im Programm auf das neue Board anpasste, ging das 
Relais nicht mehr.
Da merkte ich, dass ich für das Relais PB7 gewählt habe :-/ der ist ja 
normalerweise für das Quarz.
Ich habe der Mega aber auf internen Takt gestellt.
Nach allem was ich las, sollte der PB7 dann als Ausgang benutzt werden 
können.
Geht aber nicht :-(

Kann mir wer sagen woran das liegen könnt?

mein Portdefine und init sind im Anhang.
Vorab: ich weiß, dass die Header aufgeteilt in .h und .c gehört aber das 
splitte ich immer erst, wenn die fix und fertig ist.

Die ganzen LED_...Funktionen können alle problemlos verwendet werden.
Lediglich die Relais_...funktionen funktionieren nicht!
Der compiler motzt aber nicht und das Programm bleibt bei Aufruf auch 
nicht hängen, sondern überspringt die relais_toggle funktion scheinbar 
einfach...

HILLFE ^^

mfg

von holger (Gast)


Lesenswert?

if( RELAISPORT & (1<<RELAIS))  // wenn relais pin7 ! aus ist ist...
      {
        RELAISPORT |= (1<<RELAIS);  //...einschalten!
      }

Wenn Relaispin an ist setze Relaispin...;)

von Christian P. (peterfrosta)


Lesenswert?

DANKE.
das war ja dä(h?)mlich!! aber leider ist das nicht die ursache....
habe es jezt geändert:

void relais_tog()
{

  if( RELAISPORT & (1<<RELAIS))  // wenn relais pin7 ! aus ist ist...
  {
    //RELAISPORT |= (1<<RELAIS);  //...einschalten!
    RELAISPORT &= ~(1<<RELAIS);
  }
  else
  {
    //RELAISPORT &= ~(1<<RELAIS);  // sonst ausschalte!
    RELAISPORT |= (1<<RELAIS);
  }
}


geht aber net.

das war falsch, weil ich hatte bei der ursprungsplatine gegen 5 V 
geschaltet und nun gegen Masse...

von Falk B. (falk)


Lesenswert?

@  Christian Peskov (peterfrosta)

>void relais_tog()

Geht deutlich einfacher, wenn man ein wenig über Bitmanipulation 
bescheid weiß.
1
{
2
  RELAISPORT ^= (1<<RELAIS);
3
}

Ausserdem hast du noch ein eeher schlechte Programierweise. In ports.h 
gehörten dur DEKLARATIONEN von Funktionen, defines, etc. Die DEFINITION, 
als der "echte" Quelltext gehört in ports.c. Den der wird nur einmal 
komppilier, ports.h aber mehrfach per include in andere Quelldateien 
eingebunden. Das könnte auch dein Problem sein.

von Christian P. (peterfrosta)


Lesenswert?

Danke auch an dich Falk!

lauf nicht weg! ich muss nur aufpassen dass das essen nciht anbrennt, 
dann antworte ich^^

von Christian P. (peterfrosta)


Lesenswert?

Falk Brunner schrieb:
>>void relais_tog()
>
> Geht deutlich einfacher, wenn man ein wenig über Bitmanipulation
> bescheid weiß.
> {
>   RELAISPORT ^= (1<<RELAIS);
> }

 also:

void relais_tog(void)
 {
  RELAISPORT ^= (1<<RELAIS);
 }

?? ha, ja das ist wirklich deutlich einfacher! geil. danke

Falk Brunner schrieb:
> Ausserdem hast du noch ein eeher schlechte Programierweise. In ports.h
> gehörten dur DEKLARATIONEN von Funktionen, defines, etc. Die DEFINITION,
> als der "echte" Quelltext gehört in ports.c. Den der wird nur einmal
> komppilier, ports.h aber mehrfach per include in andere Quelldateien
> eingebunden. Das könnte auch dein Problem sein.

Mit solch einer Antwort hatte ich ja gerechnet und deshalb das ganz oben 
schon vorweggenommen.
Wenn du aber sagst, das könnte dir Ursache meines Problems sein, werde 
ich das natürlich gleich vernünftig in .c und.h aufteilen!

Viel übrig bleibt mir ja auch nicht... wenn das dann auch ngeht, werde 
ich das relais wohl auslöten und gucken was am PB7 passiert...

von Falk B. (falk)


Lesenswert?

@  Christian Peskov (peterfrosta)

>Viel übrig bleibt mir ja auch nicht... wenn das dann auch ngeht, werde
>ich das relais wohl auslöten und gucken was am PB7 passiert...

Eine Messung per Multimeter oder LED mit 1K Vorwiderstand ist 
deutlich einfacher und schneller.

von Falk B. (falk)


Lesenswert?

Was ist dass denn für ein Relais? Wenn es DIREKT am PORT hängt, muss es 
schon recht sparsam sein. 5V Relais mit weniger als 20mA sind eher 
selten.

Ansonsten siehe Relais mit Logik ansteuern

von Thomas E. (thomase)


Lesenswert?

Christian Peskov schrieb:
> Viel übrig bleibt mir ja auch nicht... wenn das dann auch ngeht, werde
> ich das relais wohl auslöten und gucken was am PB7 passiert...
Ein ordenliches Relais hat eine integrierte Freilaufdiode.

Christian Peskov schrieb:
> das war falsch, weil ich hatte bei der ursprungsplatine gegen 5 V
> geschaltet und nun gegen Masse...
Dann muss das Relais auch umgedreht werden.

mfg.

von Christian P. (peterfrosta)


Lesenswert?

jau... danke danke an alle... es geht...

Danke vorallem auch an holger. Das hätte ewig gedauert, bis mir das 
aufgefallen wäre ^^
der Spulen-Vorwiderstand war dann noch zu groß...

falk.. also an den headers hat es nicht gelgen... das trenne ich aber 
als bald... beim prgrommieren ist es nur leider einfacher erst alles in 
eine Datei zuschreiben...

dein MegaMove für meine Relais_togglefunktion, ist das so:  ?

   relaisport wie vorher nur das eine Bit nigieren!
?

@thomas: das Relais hat keine Polung im Datenblatt angegeben, daher 
denke ich, dass diese egal sein sollte...

beste grüße aus bochum

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.