PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel MEga32 --> Input



Killer
08.02.2007, 19:49
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

Jon
08.02.2007, 19:51
Hast du die Pull-Up-Widerstände aktiviert? Ohne die geht es nicht.

jon

Killer
08.02.2007, 19:54
Pull-Up Wiederstände sagt mir jetzt nichts von ist dies warscheinlich nicht der Fall;-)

Wie aktiviere ich sie?

MfG Killer

wkrug
09.02.2007, 07:52
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.

Jon
09.02.2007, 12:38
Poste mal deinen Code.

jon

Killer
09.02.2007, 19:46
$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, 19:51
Hallo

mach mal den Pullup Widerstand an Pin D6 an:

Portd.6=1

müsste dann von der Software funktionieren

Killer
09.02.2007, 20:24
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, 20: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

wkrug
09.02.2007, 22:26
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, 22: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.

wkrug
09.02.2007, 23:15
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
09.02.2007, 23:39
ja, ich meine es muss "Config Portc.0 = Output" heißen
bin mir aber nicht sicher, ob das nicht egal ist.

Jon
10.02.2007, 07:28
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, 13: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...

Jon
10.02.2007, 13:28
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

JonnyP
10.02.2007, 13:41
...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 ;-)

Jon
10.02.2007, 13:46
...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

Killer
10.02.2007, 19:09
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

JonnyP
11.02.2007, 17:05
@Jon
Wie willst du mit dem Controller eine LED schalten, wenn ALLE Ports als Input deklariert sind???

Jon
11.02.2007, 17:08
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

JonnyP
11.02.2007, 17:16
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... ;-)