Hallo,

Ik heb een atmega88, en daar heb ik een drukknop op aangesloten op pin PB0. Deze drukknop loopt van de pin van de atmega naar de gnd. Zoiets als dit dus :

GND-------drukknop--------atmega88

Hier is mij bascom code :


cls 'LCD inladen
waitms 10 'Korte pauze voor de LCD

config PINB.0 = input 'Maak van PINB.0 een ingang
PINB.0 = 1 'Interne pull up aan

do
If PINB.0 = 0 then 
lcd "Knop ingedrukt"
waitms 500
end if
loop

Toch gebeurt er niks als ik de knop indruk ... ?
Wat zou het probleem kunnen zijn ?

Voedingsspanning atmega88 aanwezig?

[Bericht gewijzigd door ohm pi op (15%)]

volgens de help index:

'reading the PORT, will read the latch, that is the value

'you have written to the PORT.

'This is not the same as reading the logical values on the pins!

'When you want to know the logical state of the attached hardware,

'you MUST use the PIN register.

A = Pind

dus eerst de waarde in een variable stoppen, en dan de if-then

PINB.0 = 1 moet worden PORTB.0 = 1

PINB gebruik je als je iets wil IN doen
PORT gebruik je als je iets O(uit) wil doen.

Pull up inschakelen is dus met een OUT.

@ohm pi: uhhhm,... ja...

Bedankt voor de info !

Dus dan gaat het zoiets als dit worden :


cls 'LCD inladen
waitms 10 'Korte pauze voor de LCD
 
config PORTD.0 = input 'Maak van PINB.0 een ingang
PORTD.0 = 1 'Interne pull up aan
 
do
If PINB.0 = 0 then 
lcd "Knop ingedrukt"
waitms 500
end if
loop

Op 14 juli 2010 23:59:48 schreef avr-linux:
@ohm pi: uhhhm,... ja...

Bedankt voor de info !

Dus dan gaat het zoiets als dit worden :

Ehh. nee.


cls 'LCD inladen
waitms 10 'Korte pauze voor de LCD
 
config PORTB.0 = input 'Maak van PINB.0 een ingang
' Ik zou DDRB.0 = 0 schrijven, maar kennelijk hoort dat in jou taaltje anders.

PORTB.0 = 1 'Interne pull up aan
 
do
If PINB.0 = 0 then 
lcd "Knop ingedrukt"
else 
lcd "niet ingedrukt"
endif
waitms 500
loop

Nee ik kom er nog steeds niet uit vreemd genoeg.
Ik had de volgende code :


cls 'LCD inladen
waitms 10 'Korte pauze voor de LCD
 
config PORTB.0 = input 'Maak van PINB.0 een ingang
.
 
PORTB.0 = 1 'Interne pull up aan
 
do
lcd pinb.0
waitms 300
loop
 

En dan zie ik soms een 1 en soms een 0 op het scherm, ook al raak ik de schakelaar niet aan ...

Volgens mij heb je last van contactdender. Condensatortje en weerstandje zouden het probleem moeten oplossen

(Of softwarematig natuurlijk, maar dat is wat complexer).

Ishet niet Pinb.0 ipv pinb.0?

@drieske: bascom maakt er zelf hoofdfletters van normaal maar het is dus inderdaad PINB.0.

@stefanh: hoe zou ik dat software matig op kunnen lossen dan ? En noemen ze dat ook niet debounce ?

Tellertje starten als de knop ingedrukt wordt. Aan het einde van de telperiode kijken of de knop nog is ingedrukt. Aan de hand daarvan een uitgang in of uitzetten.

En ja, debounce = anti-contactdender.

[Bericht gewijzigd door Stefanh001 op (11%)]

Debouncen heeft hier helemaal geen zin. Er is immers een loop die elke ronde kijkt wat de status van de input is en die print. Als dat een paar keer dendert en de foute waarde geeft, wat geeft dat?

TS,
-Probeer eens een andere input
-Check de datasheet of de input misschien een dubbele functie heeft. Soms moet een andere functie nog configureren om die pin vrij te krijgen.

ik denk dat je het foute register te pakken hebt om de pullup in te schakelen. willekeurig hoog of laag is typisch een geval van een zwevend signaal (waar dus pullup nodig is).

Ik zou dus op zoek gaan in de datasheet bij portb, bij de extra functies, naar het pullupregister.

Probeer het eens met DEBOUNCE om de kontaktdener te onderdrukken.
Zie de helpfile voor meer details.
[code=Bascom]
cls 'LCD inladen
waitms 10 'Korte pauze voor de LCD

config PORTB.0 = input 'Maak van PINB.0 een ingang
.

PORTB.0 = 1 'Interne pull up aan

do
Debounce Pinb.0 , 0 , Mysub ,sub
loop
end

Mysub:
lcd "PINB.0 was/is low"
Return

@2N3055: Ja dat werkt perfect !!!, dankjewel.

En de andere die mij hebben geholpen ook bedankt !

En wat is je verklaring voor het feit dat het nu wel werkt? Waarom werkte het eerst niet? (debouncen kan het dus niet zijn)

De verklaring dat het nu wel werkt ... ja het ligt echt aan de code.
Dus meer kan ik er niet van zeggen want ik heb niks verandert aan de hardware.

Ja, dat snap ik ook nog wel. De leukste thuis op de deurkruk na :-)
Maar WAT aan de code maakt dat het nu wel werkt?

Nee, en je mag best je opmerkingen voor je houden.
Maargoed ja het is denk ik toch de debounce en de vele snellere loop.

@Flipflop, door de DEBOUNCE wordt de kontaktdender van de schakelaar onderdrukt waardoor een juiste lezing hebt van de input.
DEBOUNCE doet niks anders dan nadat de knop is ingedrukt 20ms wachten.
Kun je ook zelf maken, bv:


do
If pinb.0 = 0 then  'Knop is ingedrukt
 waitms 20 'Laten we 20ms wachten
  lcd  pinb.0 
end if
waitms 300
loop

Bij mij gaan de nekharen overeind staan, telkens ik zo'n code onder ogen krijg. Het zal allemaal wel werken als je de juiste instructies gebruikt, maar weet je ook wát er precies gebeurt? Kan je de datasheet naast je code leggen, en zo registers e.d. vergelijken? Ik vrees er voor.

Dan toch liever C, dat enerzijds gemakkelijker in te tikken is dan assembly, en anderzijds toch heel nauw aansluit bij de uiteindelijke (assembly-) broncode.
En zeg nou zelf: als je voor Linux een device-driver wil schrijven, moet je toch ook met C aan de slag? :-)