Nutzung der Pins D.0 bis D7 beim ATMEGA8

AVR_ETX

Neues Mitglied
07. Juni 2011
8
0
1
Sprachen
Hallo zusammen,

Zur Einleitung: ich benutze die Evaluations Boards von Pollin (da schalten die Tasten nach +5V(!) und offen liegt der Kontakt über 33k||330n auf Masse) und einen Atmega8.

Ich komme bei folgendem Problem nicht weiter:

ich möchte beim Atmega8 den Port D weitestgehend mit benutzen. Nun bin ich schon am Anfang steckengeblieben.

Ich wollte mit 4 Pins (PinD.0, PinD.1 PinD.4 und PinD.5) über 4 Taster zwei Variablen herauf- und herunterzählen (PinD.1 und PinD.2 sind wohl die Externen Interrupts, die brauche ich noch).

Kurz und schmerzvoll - ich bekomme lediglich PinD.1 und PinD.4 als Eingänge über die ersten zwei Tasten angesprochen.
PinD.0 scheint permanent als Ausgang auf H zu liegen und der Rest reagiert nicht (die Tastensignale liegen aber an den Pins lauf Logiktester an).

Nun sehe ich im Datenblatt des Atmga8, dass sich auf den Pins allerlei "Alternate Functions" tummeln, das Abschalten derselben bekomme ich aber nicht hin, ausserdem "hinkt" mein Englisch ziemlich.

Also meine Frage: wie kann ich die Pins trotzdem als normale Eingäng nutzen?

Hier mein Code bis jetzt:

Code:
$regfile = "m8def.dat"                  'definieren des verwendeten Chips
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 8000000                      'definieren des verwendeten externen Quarz (8MHz)


'B.0 bis B.7 alle auf Ausgang ohne Pullup, hier hängt das LCD dran
 Ddrb = &B11111111
Portb = &B00000000
'C.0 Eingang fürs Poti, C.1 bis C.5 alle auf Ausgang(c.6 Und C.7 sind nicht zu Benutzen - > Quarzanschluss)
 Ddrc = &B00111110
Portc = &B00000000                      'ohne Pullup,

 Ddrd = &B00000000                      'PD0-PD3 Eingang, PD4-PBD7 Eingang
Portd = &B00000000                      'PullUp für die Eingänge inaktiv


'------------ Konstanten ---------
Const Falsch = 0
Const Wahr = 1
'------

Enable Interrupts


'LCD konfigurieren
Config Lcd = 16 * 2                     'geht auch mit 8 * 2 Display
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4

Cursor Off Noblink

Dim Poti1 As Word
Dim Twarte As Byte , Tdimme As Byte     'Die Aktionszeiten in Minuten, werden über die Taster gestellt

'Testvorbelegung
Twarte = 3
Tdimme = 3

Tasterwtup Alias Pind.1                 'Taster WaitTime Up
Tasterwtdn Alias Pind.4                 'Taster WaitTime Down
Tasterdtup Alias Pind.5                 'Taster DimmTime Up
Tasterdtdn Alias Pind.6                 'Taster DimmTime Down

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'Acsr.7 = 1

'............ SUSs ..............................

Declare Sub Zeileclear(byval Zn As Byte)       'eine Zeile löschen
Declare Sub Zweizeilenclear             'beide Zeilen löschen

Cls
'--------- Hauptschleife -----------------------
Do
    If Tasterwtup = 1 Then
        Bitwait Tasterwtup , Reset
        Incr Twarte
    End If
    If Tasterwtdn = 1 Then
        Bitwait Tasterwtdn , Reset
        Decr Twarte
    End If
    If Tasterwtup = 1 Then
        Bitwait Tasterdtup , Reset
        Incr Tdimme
   End If
   If Tasterwtup = 1 Then
        Bitwait Tasterdtdn , Reset
        Decr Tdimme
    End If

    Poti1 = Getadc(0)
    Call Zweizeilenclear
    Locate 1 , 2
    Lcd Poti1

    Locate 2 , 1
    Lcd "W" ; Twarte ; "/" ; "D" ; Tdimme
    Waitms 200

Loop

End
'--------- ENDE Hauptschleife -----------------------

'>>>>>>>>>>>>>>>>> SUBs >>>>>>>>>>>>>>>>>>>>>>>

'eine Zeile löschen
Sub Zeileclear(zn As Byte)
    Locate Zn , 1
    Lcd "        "
End Sub

'beide Zeilen löschen
Sub Zweizeilenclear
    Locate 1 , 1
    Lcd "        "
    Locate 2 , 1
    Lcd "        "
End Sub

'<<<<<<<<<<<<<< END SUBs <<<<<<<<<<<<<<<<<<<<<<<<

Ich bin für jede Hilfe dankbar.

Grüße
Knut
 
Hallo Knut,

das verwendete Board kenne ich nicht (warum bauen die da Pulldown Widerstände hin ... mit C?! Sowas verstehe ich nicht :hmmmm:, egal :D).

Solange du keine Hardware-Module aktivierst, deren Signale eine Alternativfunktion vom PORTD sind, sind alle Pins vom PORTD als normale IO-Pins nutzbar.

In deinem Fall sollte also der gesamte PORTD als Input schaltbar sein.

Ich vermute allerdings, dass deine Alias Zuweisungen nicht stimmen. Du möchtest ja PIND0 und PIND5 als Eingang abfragen, du weist aber PIND1 und PIND6 zu.
Vielleicht liegts ja daran.

Warum allerdings im Moment ein high am Pin PD0 liegt, weiß ich nicht. Das Tastensignal dürftest du hier ja eigentlich nicht messen können, da ja der Taster nach high schaltet. Liegt hier vielleicht ein externes TXD Signal (USART) an?

Dirk :ciao:

Code:
Tasterwtup Alias Pind.1                 'Taster WaitTime Up
Tasterwtdn Alias Pind.4                 'Taster WaitTime Down
Tasterdtup Alias Pind.5                  'Taster DimmTime Up
Tasterdtdn Alias Pind.6                  'Taster DimmTime Down
 
Hallo Dirk,

Danke für die schnelle Antwort.

Die R||C Kombination gegen Masse ist das Entprellen für die Taste...

Dein Tip mit der "aktivierten Hardware" geht wahrscheinlich in die richtige Richtung... Ich kann es im Moment nicht nachprüfen aber es ist durchaus möglich, dass versehentlich die RS 232 und evtl. noch anderes gejumpert ist.
Es stimmt, man kann bei diesen "Kombi-Boards" nicht davon ausgehen, dass der Atmega "in der Luft" hängt.
Erstmal wichtig zu wissen, dass man den Prozessor eigentlich in dem Bereich ohne Vorkehrungen nutzen kann. Ich sage morgen Bescheid.

Grüße
Knut
 
Hallo Knut,
Die R||C Kombination gegen Masse ist das Entprellen für die Taste...

ja, das ist mir klar. Es hat sicherlich seine Gründe, warum der Entwickler hier Pulldown-Widerstände gewählt hat.

...Ich sage morgen Bescheid.

Ja ok.

Ich habe gerade mal den Schaltplan angeschaut. Bezüglich PD0, schau mal ob der Jumper JP1 gesetzt ist. Da ist nämlich ein RS232 Transceiver angeschlossen. An PD0 ist kein Taster auf dem Board angeschlossen oder hast du selber einen Taster an J4-28 angeschlossen?

Dirk :ciao:
 
Hallo Knut,

Die R||C Kombination gegen Masse ist das Entprellen für die Taste...
das ist allerdings die grützeligste Entprellschaltung die man finden kann. Du hast dadurch eventuell das Problem von Spannungseinbrüchen der Betriebspannung bei einem Tastendruck. Der Kondensator lädt sich dann über den Taster sehr schnell und heftig auf. Dabei bildet er einen Kurzschluß für die Versorgung. Ich hab das mal bei einem Beitrag beschrieben (ich glaub im FAQ-Bereich). Es gibt wegen den Spannungseinbrüchen und damit entstehenden sporadischen Fehlfunktionen der Atmels auf allen möglichen Seiten Umbauanleitungen für die "tolle" Entprellschaltung. Als Anfänger sucht man dadurch eventuell Fehler die durch diese grützige Konstruktion entstehen. Der einfachste Umbau ist, wenn du den Kondensator rauslötest und per Software entprellst. Die nächste Möglichkeit wäre den Kondensator parallel zum Schalter zu legen um wieder eine Entprellfunktion ohne sporadische Resets oder Fehlfunktionen zu haben. Das diese Schaltung wirklich vollständig entprellt, dafür würde ich nicht die Hand ins Feuer legen :p Die Schaltung wird aber die sehr kurzen Spikes entfernen. Du wirst also sowieso nicht um eine weitere Softwareentprellung herumkommen.

Gruß
Dino
 
Guten Morgen zusammen,

> Dino: Stimmt, diese Beschaltung ist nicht der Weisheit letzter Schluss aber es funktioniert zumindest auf dem Testboard - in der entgültigen Schaltung werde ich es sicher anders machen.
Übrigens war ich der Meinung, dass ich mit "Bitwait" eine der Arten Software-Entprellung anwende ("Debounce" wollte ich nicht nehmen) - oder ist das nicht so?


Zum anderen Problem: Ja, es waren einige Jumper gesetzt - nachdem ich die geöffnet hatte hat der Port D reagiert wie erhofft.:)
Ich habe mir natürlich auch noch einen Programmschnitzer erlaubt:
Code:
    If Tasterwtup = 1 Then
        Bitwait Tasterwtup , Reset
        Incr Twarte
    End If
    If Tasterwtdn = 1 Then
        Bitwait Tasterwtdn , Reset
        Decr Twarte
    End If
    If [U]Tasterwtup[/U] = 1 Then 'wenn man die falsche Taste abfragt wird auch nicht die richtige Var gesetzt!
        Bitwait [B][U]Tasterdtup[/U][/B] , Reset
        Incr Tdimme
   End If
   If [U]Tasterwtup[/U] = 1 Then
        Bitwait [B][U]Tasterdtdn[/U][/B] , Reset
        Decr Tdimme
    End If

Das passiert wenn man Copy and Paste macht und dann nicht aufpasst. :(

So Ihr Guten, danke für die Hilfe, Dirk hat mich ja auf die richtige Spur gebracht.

Grüße

Knut
 
Hallo Knut,

Übrigens war ich der Meinung, dass ich mit "Bitwait" eine der Arten Software-Entprellung anwende ("Debounce" wollte ich nicht nehmen) - oder ist das nicht so?

Code:
    If Tasterwtup = 1 Then
        Bitwait Tasterwtup , Reset
        Incr Twarte
    End If

denk aber bitte dann bei der Fehlersuche (unerklärliche Sachen im Programm) an diese möglichen Resets oder Fehlfunktionen durch Spannungseinbrüche be Tastendruck.

Bitwait entprellt nicht. Es wartet lediglich bis ein bestimmter Bitstatus erreicht ist.
Wenn da also steht "Bitwait Tasterwtup , Reset" , dann wartet der Atmel an der Stelle so lange bis das Bit auf Null ist und wenn es mehrere Stunden dauert :p

Debounce liest den Pin ein und merkt sich den Stand. Dann wartet es ein paar Millisekunden und testet nochmal. Wenn sich nichts geändert hat, dann prellt wohl nix. Wenn dann auch der gewünschte Zustand (0 oder 1) vorhanden ist, dann wird ins Unterprogramm gesprungen. Da wird also wirklich über eine kleine Wartezeit entprellt. Der Atmel steht dort nicht bis zum SanktNimmerleinstag bei diesem Befehl.

Im "BASCOM-AVR user manual" (als PDF herunterladbar) steht es in der Befehlsreferenz aber alles drinn.

Gruß
Dino
 
Hallo Dino,

Ok, danke für die Erklärung.
Eine Frage noch zu Bitwait: Arbeitet der Atmega während er wartet auch keine Interrups ab?

Grüße

Knut
 
Ok, danke für die Erklärung.
Eine Frage noch zu Bitwait: Arbeitet der Atmega während er wartet auch keine Interrups ab?
:confused: Keine Ahnung. Aus dem Gefühl würde ich sagen er arbeitet Interrupts ab. Hab ich aber noch nicht getestet.
Trotzdem für diese Aufgabe ein Sch... Befehl.

Gruß
Dino
 
Hi
Zum Pollin Board kann ich einiges sagen, da ich es selbst benutze. Zum einen, vergiß die Taster auf dem Board und kauf dir ein Steckbrett. Dann schaust du in deinen Kramkisten nach und suchst ein altes 40pol. IDE -Flachkabel aus einem alten Rechner. Alternativ bietet Pollin ab und zu solche aucch mal an. Damit hast du schon eine Seite für das Pollin-Board. Für die andere Seite bietet sich eine 40 pol. IC Fassung, aber mit Präzisionskontakten. Dort lötest du die andere Seite des Flachkabels entsprechend der Stiftbezeichnung. Nun hast du zum Steckbrett eine ordentliche Verbindung.
Diese Skizze zeigt, wie man unter das Flachkabel kommt, ohne ständig darunter die Kontakte zu suchen und für etwas mehr Übersicht kann man sich kleine Skizzen für verschiedene µC selbst anfertigen, diese einfolieren und mit Klettband dann als Hilfe auf der Fassung befestigen.
Steckverbindung.png
Die Taster einschließlich der RC Beschaltung kannst du getrost auf dem Pollinboard vergessen. Die Gefahr, das du mit der RC Beschaltung die Spannungsversorgung runterziehst, ist nicht von der Hand zu weisen, obwohl es mir nicht passiert ist, denn ganz am Anfang hab ich die Taster auch benutzt...

Zum Schluß noch einen Tip, falls du dich mit PonyProg rumschlägst. Kauf dir einen USBISP Stick. Den kannst du direkt auf die ISP Stiftleiste aufstecken und du wirst ihn dann nie mehr missen wollen.
Gruß oldmax
 
Hallo oldmax,

Danke für die Tipps, ich verwende zusätzlich zum Evaluationsboard noch das ATMEL Addon-Board V1.0 von Pollin, welches über die 40 polige Steckerleiste verbunden wird. Mit einigen zusätzlichen selbstgebauten Steckmodulen komme ich da ganz gut hin. Werde mir jetzt wohl noch ein "Tasterbrett" dazubauen.

Das Problem der Programmierung habe ich gleich zu Anfang mit einem USBISP-Programmer gelöst - es ist wie Du sagst, man möcht ihn nicht mehr missen.

Grüße
Knut
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)