Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel MEga32 --> Input
Hallo,
ich habe folgendes Problem: Ich habe sämtliche Ports (hintereinander zum Test) des ATMega32 auf Input gestellt und einen Taster angeschlossen. Problem: Setze ich das Überprüfen des Eingangs in eine Schleife und sage wenn Strom da ist leuchtet LED1 und wenn nicht LED2. Passieren tut allerdings nichts.
Hat jemand eine Idee was man da beachten muss?
MfG Killer
Hast du die Pull-Up-Widerstände aktiviert? Ohne die geht es nicht.
jon
Pull-Up Wiederstände sagt mir jetzt nichts von ist dies warscheinlich nicht der Fall;-)
Wie aktiviere ich sie?
MfG Killer
Die Port's des ATMEGA 32 sind, wenn sie als Eingang beschaltet wurden hochohmig.
Also schaltet man üblicherweise einen Widerstand gegen Plus (=Pull Up Widerstand) oder gegen Minus (=Pull Down Widerstand) um den Eingang auf ein definiertes Potential zu bringen.
Du schaltest also einen Widerstand von + , an den gewünschten Eingang des Controllers.
Mit dem Taster wird der Eingang dann bei betätigung nach GND durchgeschaltet.
Nun hat aber der ATMEGA 32 auch schaltbare, interne Pull Up Widerstände (ca. 47kOhm).
Wenn der Port mit dem DDRx Register als Eingang definiert ist, wäre ja das PORTx Register ohne Funktion, weil die Port Abfragen ja über das PINx Register laufen.
Wenn Du aber in das PORTx Register für den jeweiligen Port eine 1 schreibst wird der interne Pull Up Widerstand des ATMEGA 32 aktiviert und der extern angeschaltete Widerstand braucht nicht eingebaut zu werden.
Das Ganze steht aber auch so im Datenblatt.
Wenn das dann immer noch nicht geht, hast Du vermutlich einen Fehler in deiner restlichen Hardware oder deine Software ist fehlerhaft.
Hast Du auch die Fuses richtig gesetzt ? - ist eine häufige Fehlerquelle.
Poste mal deinen Code.
jon
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
$baud = 9600
Config Pinc.0 = Output
Config Pind.6 = Input
Do
If Pind.6 = 0 Then
Portc.0 = 0 'LED an
Else
Portc.0 = 1 'LED aus
End If
Loop
das wäre der Code, soll einfach nur ein einfacher Test sein. Die IF-Abfrage kann ich mit 1 und mit 0 machen passieren tut nichts. Was muss ich in den Quellcode einbauen um die Pull Up Wiederstände zu aktivieren oder läuft das anders?
MfG Killer
robo junior
09.02.2007, 20:51
Hallo
mach mal den Pullup Widerstand an Pin D6 an:
Portd.6=1
müsste dann von der Software funktionieren
Okay, ich habe den Befehl jetzt einfach vor die Schleife gesetzt:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000
$baud = 9600
Config Pinc.0 = Output
Config Pind.6 = Input
Portd.6 = 1
Do
If Pind.6 = 0 Then
Portc.0 = 0 'LED an
Else
Portc.0 = 1 'LED aus
End If
Loop
Das Problem besteht allerdings weiterhin! Ich habe den Eingang an GND und einmal an VCC geschlossen und es so versucht aber bei beidem ist die LED entweder ständig an oder nie! Was gäbe es noch für Lösungen?
MfG Killer
robo junior
09.02.2007, 21:55
guck mal hier: Link (https://www.roboternetz.de/wissen/index.php/Bascom#I.2FO-Port_als_Eingang)
vielleicht hilft dir das weiter.
Dort ist nach der If-Anweisung noch ein waitms(100) als Entprellung. Müsste aber sonst vom Programmcode stimmen
Probier mal mit einem kleinen Testprogramm, ob die Led überhaupt leuchtet.
Eventuell ist ja die JTAG Fuse noch gesetzt der einige Pins des Port C belegt.
peaceman
09.02.2007, 23:59
ich bin nicht sicher, ob das wichtig ist, aber ich definiere die ports/pins immer so:
Config Portx.x = Input
und nicht:
Config Pinx.x = Input
auch wenn man dann die eingänge über pinx.x und ausgänge über portx.x anspricht.
Ich kenn mich jetzt nich mit Bascom aus.
Aber in deinem Code steht : Config Pinc.0 = Output
Das wäre dann doch falsch ? oder.
peaceman
10.02.2007, 00:39
ja, ich meine es muss "Config Portc.0 = Output" heißen
bin mir aber nicht sicher, ob das nicht egal ist.
Der Code müsste so aussehen:
$regfile = "m32def.dat"
$crystal = 1000000
$framesize = 32
$swstack = 32
$hwstack = 32
$baud = 9600
Config Portc.0 = Output
Config Pind.6 = Input
Portd.6 = 1
Do
If Pind.6 = 0 Then
Portc.0 = 0 'LED an
Else
Portc.0 = 1 'LED aus
End If
Loop
End
"ja, ich meine es muss "Config Portc.0 = Output" heißen
bin mir aber nicht sicher, ob das nicht egal ist"
Muss es. Sonst geht es nicht!!
jon
1hdsquad
10.02.2007, 14:16
@ robo junior: Das ist egal, solange er drückt, muß die Led leuchten. Entprellen mußt du nur bei Tastern, damit er nicht mehrmals ein Signal abgibt.
Es muß "PORTX:X" bei output und "PINX:X" bei input heißen.
Standartmäßig sind übrigens alle Pins auf Input gesetzt, es muß also eigentlich nur der Output angegeben werden...
MFG
Achso: Bearbeite nochmal deine nCode, er hat [b] etc drin...
Ich habe den Code verbessert. Ich dachte eigentlich, dass das dann dick gedruckt wird, damit er schneller sieht, wo ich etwas geändert habe. Naja.
jon
...ich habe folgendes Problem: Ich habe **sämtliche Ports** (hintereinander zum Test) des ATMega32 auf Input gestellt und einen Taster angeschlossen. Problem: Setze ich das Überprüfen des Eingangs in eine Schleife und sage wenn Strom da ist leuchtet LED1 und wenn nicht LED2. Passieren tut allerdings nichts.
Ohne deinen Code gelesen zu haben: Die Pins mit den LEDs müssen Output sein ;-)
...ich habe folgendes Problem: Ich habe **sämtliche Ports** (hintereinander zum Test) des ATMega32 auf Input gestellt und einen Taster angeschlossen. Problem: Setze ich das Überprüfen des Eingangs in eine Schleife und sage wenn Strom da ist leuchtet LED1 und wenn nicht LED2. Passieren tut allerdings nichts.
Ohne deinen Code gelesen zu haben: Die Pins mit den LEDs müssen Output sein ;-)
Sorry, aber das verstehe ich nicht.
jon
LED funktioniert auf jeden Fall, ob ich jetzt "Config Pinc.0"
oder "Config Portc.0" verwende. Das Problem mit dem Input besteht aber weiterhin! Sollte es im normalfall jetzt funktionieren? ;-)
MfG Killer
@Jon
Wie willst du mit dem Controller eine LED schalten, wenn ALLE Ports als Input deklariert sind???
Ich habe das so interpretiert, dass er immer einen Pin als Ausgang definiert hat. aber jetzt beim durchlesen mit deinem Hinweis fällt mir auf, dass er Port geschrieben hat und nicht Pin.
Trotzdem sagt er nicht im Programm:
Definiere Pinx als Eingang,
sonder :
Definiere Pinx,y als Eingang.
Deswegen...
jon
Ich hab mich nur über "SÄMTLICHE Pins als Eingang" gewundert und deshalb gar nicht erst den Code gecheckt. Manche Fehler sind so trivial.
Meine erste Input-Abfrage galt den Ports anstatt den Pins... ;-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.