www.mikrocontroller.net

Forum: Compiler & IDEs Eingänge an Tiny25 auslesen


Autor: Kai A. (grille)
Datum:

Bewertung
0 lesenswert
nicht 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:
//Pumpe unterbrechen (zum Befüllen)
if(PINB & (1<<PIN_SCHALTER))
{
  PORT_PUMPE &= ~(1<<PIN_PUMPE);
  p=1;
}

if(p != 0)
{
  p++;
  if(p > 30)
  {
    p=0;
    PORT_PUMPE |= (1<<PIN_PUMPE);
  }
    
}

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Kai A. (grille)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai A. (grille)
Datum:

Bewertung
0 lesenswert
nicht 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):
while(1)
{
  //prüfen, ob Reglerintervall abgelaufen ist
  if(intervall>REGLERINTERVALL)
  {
    //Reglerzähler zurücksetzen
    intervall=0;
    
    e = ReadADC();
    
    //klassischer 2-Punkt-Regler (oder so ähnlich...)
    if(e < (ADC_SOLL-1))
      PORT_HEIZUNG |= (1<<PIN_HEIZUNG);
    else if(e > ADC_SOLL)
      PORT_HEIZUNG &= ~(1<<PIN_HEIZUNG);
    
    //Ready LED anschalten, wenn Endtemperatur erreicht ist
    if(e<ADC_SOLL-2)
      PORT_READY_LED &= ~(1<<PIN_READY_LED);
    else
      PORT_READY_LED |= (1<<PIN_READY_LED);
    
    //Pumpe unterbrechen (zum Befüllen)
    if(! (IN_SCHALTER & (1<<PIN_SCHALTER)) )
    {
      PORT_PUMPE &= ~(1<<PIN_PUMPE);
      p=1;
    }
    
    if(p != 0)
    {
      p++;
      if(p > 30)
      {
        p=0;
        PORT_PUMPE |= (1<<PIN_PUMPE);
      }    
    }
  }  
}

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kai A. (grille)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.