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 ?
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
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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).
@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%)]
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
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? 