PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR-Controller: Verlässlichkeit der internen Pullups?



Powell
21.06.2007, 19:59
Hallo

Ich habe jetzt schon die zweite Applikation (einmal mit MEGA8 und einmal mit ATTiny25) bei der ich unvorhergesehene Probleme bei meinen Controllereingängen hatte. Softwareseitig habe ich die Eingänge auf High gesetzt (interne Pullups) und einen Eingangsimpuls auf die Abfallende Flanke abgefragt, den Eingang also auf Low gezogen.
Nun zeigte sich bei meiner Anwendung ein unregelmäßiges "übersehen" von manchen Eingangssignalen. Was seltsam war und ich per Zufall endeckte: Wenn ich mit dem Finger den Eingang berührte (ansonsten kein Potential) wurden alle Eingangssignale erkannt.
Ich schaute mir den Eingang am Oszilloskop an und musste feststellen dass er alles andere als durchgängig auf High war. Er Wechselte immer wieder in regelmäßigen Intervallen voon High auf Low, zwischendurch war er auch immer mal dauerhaft auf low. Was ich weiterhin feststellen musste ist, dass die Impulsbreite des Störsignals am Eingang genau der im Programm erzeugten Variablen T in Millisekunden entsprach. Diese Tatsache hat mich dann noch mehr erstaunt.... Woher kann so ein Signal kommen? Ich versteh es einfach nicht, Software und Hardware sind 100% in Ordnung, und wenn ich einen externen 10K Pullup an den Eingang lege funktioniert das ganze auch wieder einwandfrei.. aber kann mir irgendjemand erklären wie sowas kommen kann? Ich meine die Internen Pullups sollen doch eigentlich die externen ersetzen, warum muss ich jetzt doch wieder nen externen Pullup einbringen?

Ich habe das Listing auch mal mit angehängt

Grüße Paul
$regfile = "attiny25.dat" 'Prozessor-Deklarationen

$crystal = 1000000 'Quarz: 1,000 MHz Intern


Declare Sub Hoch

Declare Sub Runter

Dim A As Byte

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte , T As Byte
Channel = 1

'---------------------------------------------------------

Ddrb = &B00011000 'Pin Pb0,1,2 Ausgang, rest Eingang

Portb = &B11100111 'Pullups der Eingänge aktiviert 'PullUp von Pin PD0+1+rest aktivieren

'----------------------------------------------------------


Do
W = Getadc(channel)
Debounce Pinb.3 , 0 , Hoch , Sub 'Entprellte Tasterabfrage

Debounce Pinb.4 , 0 , Runter , Sub

If W < 128 Then
T = 50
End If

If W > 128 And W < 384 Then
T = 75

End If

If W > 384 And W < 640 Then
T = 100

End If

If W > 640 And W < 896 Then
T = 125

End If

If W > 896 Then
T = 150
End If


Loop

'----------------------------------------------------------

Sub Hoch


Portb.0 = 1
Waitms T
'^^^^^^^^^^^^^^^^--------------------------------------------- Schaltzeit

Portb.0 = 0


End Sub

Sub Runter




Portb.1 = 1
Waitms T
'^^^^^^^^^^^^^^^^--------------------------------------------- Schaltzeit

Portb.1 = 0


End Sub


End

uffi
21.06.2007, 20:39
Ich vermute, dass bei Deinem Code unabsichtlich die Pullups wieder deaktiviert werden (durch Zugriff auf PORTB). Ich würde Dir empfehlen, dies mal in dem zugehörigen Assembler Code zu überprüfen.

Hubert.G
21.06.2007, 21:24
Ddrb = &B00011000 'Pin Pb0,1,2 Ausgang, rest Eingang

Portb = &B11100111 'Pullups der Eingänge aktiviert 'PullUp von Pin PD0+1+rest aktivieren

Ich kann zwar kein BASCOM aber ich glaube nicht das der Kommentar mit dem was du einstellst zusammenpasst.

Hubert

Powell
21.06.2007, 23:18
Hi

Die Kommentare sind in der Tat nicht passend zum Listing... habe immer mal rumkopiert und verändert und auf die Kommentare nicht mehr geachtet O:-)

Assembler kann ich leider nicht... bin froh wenn ich meine Codes irgendwie in Bascom zusammenkriege.
Ich denke dass es auf jeden Fall was mit dem ADC zu tun hat... aber wieso?