Forum: Compiler & IDEs Eingänge an Tiny25 auslesen


von Kai A. (grille)


Lesenswert?

Hi allerseits!
Ich bastel gerade eine kleine Temperaturregelung für mein Ätzbad (wohl 
immer wieder eines der ersten Probleme, die am Anfang eines Heimlabors 
auftauchen :). Dazu verwende ich einen tiny25, an dem eine Blubberpumpe, 
ein Heizstab und ein Thermometer hängen. Die Regelung funktioniert auch 
schon ganz gut.
Nun zu meinem Problem:
Ich möchte für die Befüllung des Bades kurzfristig die Pumpe abschalten, 
damit nichts rausspritzt. Dazu habe ich noch einen Taster angeschlossen, 
der mit der Regelung ca. einmal pro Sekunde abgefragt wird. Wenn er dann 
gedrückt wird, soll die Pumpe für ca. 30s ausgehen und danach wieder an. 
Den Code dafür habe ich mir folgendermaßen vorgestellt:
1
//Pumpe unterbrechen (zum Befüllen)
2
if(PINB & (1<<PIN_SCHALTER))
3
{
4
  PORT_PUMPE &= ~(1<<PIN_PUMPE);
5
  p=1;
6
}
7
8
if(p != 0)
9
{
10
  p++;
11
  if(p > 30)
12
  {
13
    p=0;
14
    PORT_PUMPE |= (1<<PIN_PUMPE);
15
  }
16
    
17
}

Leider funktioniert das ganze nicht. Keine Fehlermeldungen, aber auch 
keine Reaktionen auf den Taster. Achso, den Taster habe ich 
folgendermaßen initialisiert:
1
//Schalterpin auf Eingang setzen
2
DDR_PORT_SCHALTER &= ~(1<<PIN_SCHALTER);
3
PORT_SCHALTER |= (1<<PIN_SCHALTER);

D.h. ich möchte die internen Pull-Up Wiederstände verwenden. Der Taster 
müsste dann eigentlich nur noch zwischen GND und VCC umschalten.
Vielleicht hab ich aber auch noch irgend einen ganz dummen Fehler 
reingebaut...

Vielen Dank schon mal im Vorraus,
Kai

von Stefan E. (sternst)


Lesenswert?

> D.h. ich möchte die internen Pull-Up Wiederstände verwenden. Der Taster
> müsste dann eigentlich nur noch zwischen GND und VCC umschalten.

Ist es denn auch wirklich ein "Umschalter" und nicht nur einfach ein 
"Schließer"?
Wenn es ein Schließer ist, sollte er den Portpin mit GND verbinden. Und 
du musst dann natürlich auf Low testen (also den Sourcecode ändern).

von Kai A. (grille)


Lesenswert?

>Ist es denn auch wirklich ein "Umschalter" und nicht nur einfach ein
>"Schließer"?

Naja, der Taster tastet gegen GND. Das ganze sollte natürlich negiert 
werden, damits Sinn macht, aber es funktioniert dann immer noch nicht. 
Ohne die Negierung sollte die Pumpe zumindest immer aus bleiben. Es 
passiert aber rein gar nichts.
Zum Verständinis sollte vl noch hinzugefügt werden, dass der gezeigte 
Code in einer größeren Schleife läuft, die einmal pro Sekunde aufgerufen 
wird. Sobald der Taster losgelassen wird, soll die zweite if-Anweisung 
als Zähler für 30 Schleifendurchläufe fungieren. Danach wird die Pumpe 
dann selbstständig wieder eingeschaltet.
Kann es sein, dass es nicht möglich ist, die Eingangspins zu verwenden, 
wenn der ADC auch verwendet wir (auf einem anderen Pin natürlich)? Den 
benutze ich nämlich für das Einlesen der Temperatur.

Grüße,
Kai

von Stefan E. (sternst)


Lesenswert?

> Naja, der Taster tastet gegen GND. Das ganze sollte natürlich negiert
> werden, damits Sinn macht, aber es funktioniert dann immer noch nicht.

Wie hast du es negiert? Mach mal ein "Sourcecode-Update".

> Kann es sein, dass es nicht möglich ist, die Eingangspins zu verwenden,
> wenn der ADC auch verwendet wir (auf einem anderen Pin natürlich)?

Doch, ist möglich.

von Kai A. (grille)


Lesenswert?

So, hier der komplette Code der Schleife, die die Temperatur regelt. 
Dann kann man sich das ein Bisschen besser vorstellen (hoffe das wirkt 
jetzt nicht überladen):
1
while(1)
2
{
3
  //prüfen, ob Reglerintervall abgelaufen ist
4
  if(intervall>REGLERINTERVALL)
5
  {
6
    //Reglerzähler zurücksetzen
7
    intervall=0;
8
    
9
    e = ReadADC();
10
    
11
    //klassischer 2-Punkt-Regler (oder so ähnlich...)
12
    if(e < (ADC_SOLL-1))
13
      PORT_HEIZUNG |= (1<<PIN_HEIZUNG);
14
    else if(e > ADC_SOLL)
15
      PORT_HEIZUNG &= ~(1<<PIN_HEIZUNG);
16
    
17
    //Ready LED anschalten, wenn Endtemperatur erreicht ist
18
    if(e<ADC_SOLL-2)
19
      PORT_READY_LED &= ~(1<<PIN_READY_LED);
20
    else
21
      PORT_READY_LED |= (1<<PIN_READY_LED);
22
    
23
    //Pumpe unterbrechen (zum Befüllen)
24
    if(! (IN_SCHALTER & (1<<PIN_SCHALTER)) )
25
    {
26
      PORT_PUMPE &= ~(1<<PIN_PUMPE);
27
      p=1;
28
    }
29
    
30
    if(p != 0)
31
    {
32
      p++;
33
      if(p > 30)
34
      {
35
        p=0;
36
        PORT_PUMPE |= (1<<PIN_PUMPE);
37
      }    
38
    }
39
  }  
40
}

Die Variable intervall wird in einem Timerinterrupt hochgezählt. Negiert 
habe ich einfach, indem ich dem ganzen Ausdruck ein "!" vorangestellt 
habe. Sonst würde wie erwähnt die if-Anweisung ständig auslösen, wenn 
der Taster gegen GND nicht gedrückt ist. Leider bin ich mit der 
Fehlersuche noch keinen Schritt weiter :(

Gruß,
Kai

Edit:
Am ADC sollte es nicht liegen. Habe ihn probehalber ganz aus dem Proggi 
genommen, aber keine Besserung: Immer noch Null Reaktion auf den Taster 
:(

von Stefan E. (sternst)


Lesenswert?

Also am Sourcecode liegt es (meiner Meinung nach) nicht.
Kontrolliere mal die Definitionen von IN_SCHALTER und PIN_SCHALTER und 
vergleiche das mit der Hardware. Hängt der Taster wirklich am richtigen 
Pin?
Und was ist mit der Pumpe? Hängt die am richtigen Pin? Funktioniert das 
Schalten der Pumpe ganz grundsätzlich?

von Kai A. (grille)


Lesenswert?

So, heute einen neuen Controller gekauft und eingebaut: Alles klappt 
perfekt! Wie es aussieht war wohl irgendwas mit dem Flashspeicher nicht 
in Ordnung - der wurde immer nur bis zum ca. 600. Byte Interpretiert. 
Der gewünschte Effekt befand sich aber danach. Keine Ahnung, wie das 
beim Programmieren funktioniert hat, da ja immer der Speicher zur 
Kontrolle noch einmal überprüft wird... Auf jeden Fall tuts jetzt freu 
. Trotzdem vielen Dank für die Bemühungen!

Grüße,
Kai

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.