PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm funktioniert nicht richtig!



papuadive
05.12.2007, 15:34
Hallo, brauche mal wieder die Profis!
Frage:
Wenn ich bei Mega 8 den Portb als INPUT definiere und die PULLUP’s auf HIGH setzte und den Portc auf Ausgang und ich anschließend die Pin’s b0-b4 auf Masse ziehe weil ich zB: Kontakte überwachen möchte, wann sie geöffnet sind, so kann ich den µP über meinen ISP STK 300 nicht mehr programmieren bzw. darauf zugreifen.
Nehme ich die Masse der Pin’s b0-b4 wieder weg, so funktioniert es wieder.
Woran liegt das?


.include "m8def.inc"
.def temp = r16
ldi r16, 0b00000000
out DDRB, r16
ldi temp, 0b11111111
out PORTB,temp
ldi r16, 0b11111111
out DDRC, r16
main:
in r16,PINB ;lies die Bitkomb. von Portb ein
andi r16,0b00011111 ;wenn kein Klappe offen,Schalter geschl.--> auf Masse gezogen
breq main ;zB:Portb hat 11100000 AND 00011111=00000000--> jump mainl
ldi r16,0b00000010 ;lade die Bitkomb. 00000001 ins Register R16
out portc,r16 ;Ausgabe auf Portc die Bitkomb. des Registers R16
teste_S5:sbic PINB,5 ;wenn Bit 5 auf Portb 0 (Z=1) ist überspringe nächsten Bef.
rjmp teste_S5 ;springe zu Label teste_S5
ldi r16,0b00000000 ;lade die Bitkomb. 00000000 ins Register R16
out portc,r16 ;Ausgabe auf Portc die Bitkomb. des Registers R16
rjmp main

Code-Tags spendiert vom Mod
Dieses Programm bewirkt folgendes:
Ich möchte 5 Klappen (Port b0-b4) überwachen. Wird eine der insges. 5 ausgelöst (Bin auf Masse), sollte die Lampe angehen.
Wird jedoch S5 geschalten (b5 auf Masse) so wird die Lampe unterdrückt (Pin Portc 2 = 0)

Leider funktioniert das nicht so hundertprozentig! Portc Pin 2 zieht nicht richtig auf Masse, wenn ich den S5 drücke sollte die Led (low current Rv 1k2) am Testboard nicht leuchten. Tut sie aber (1,8V anstelle 0V)
War immer der Meinung, wenn ich den Ausgang auf 0 setze, dann ist dieser auf Masse und nicht irgendwo! Und umgehrt natürlich auch. Was mache ich falsch?
Danke Papua

Besserwessi
05.12.2007, 18:56
Das Programm läßt sich besser in einem Programfenser lesen. Wozu wird .del temp,r16 geschrieben und dann doch wieder R16 statt temp benutzt.
Das Programm gibt immer erst mal 1 Auf portC2 aus und überschreibt in dann ggf. mit 0. Es wird also entweder 1 oder ein Rechtecksignal ausgegeben, das für ein Multimeter halt ie etwa 2 V aussieht.

Das Programmieren geht über die Pins PB2-PB5, kann also nicht gehen wenn die hart auf Masse sind. Wenn es gehen soll, dann Widerstände ca. 5 kOhm vor die Schalter/Klappen.

papuadive
06.12.2007, 15:39
super, danke das macht sinn, mit den pins pb2-pb5. was ich noch nicht verstehe ist: war immer der meinung, dass der out port ein ausgangsregister ist und der nur 2 zustände kennt 0 oder 1 (=5V) und kein rechtecksignal puls/pause 50:50 weshalb ich dann auch 2,5V herausbekomme.
danke
papua

Johnes
07.12.2007, 11:50
Der Port macht auch nur "1" oder "0"! Nur ist dein Messgerät so träge, dass es nur den Effektivwert der Spannung messen kann. Mit einem Oszi wirst du dein Rechteck sehen können.

Aktuell arbeitet dein Prog so:

Prüfe ob in I1 bis I4 irgendwas ansteht.
Wenn ja, setze Ausgang O1
Wenn nein, lösche Ausgang O1

Prüfe ob I5 = 1
Wenn ja, setze Ausgang O1
Wenn nein, lösche Ausgang O1

Besser ist es, alles in ein Register zu laden, komplett zu verarbeiten und dann wieder ausgeben!

IN Portb, R16
IN Portc, R17
Verarbeiten der I/O's in den Registern
OUT Portc, R17


Also Prüfen ob Eingang I1-I4 so wie gewünscht
UND
Prüfen ob I5 gedrückt!

Je nach Bedürfnis die Bits des ausgangsregisters setzen und dann in den Port schieben.

MfG

papuadive
08.12.2007, 12:58
danke für die antwort, aber woher kommt das rechtecksignal, denn so viel ich weiß, wird ein ausgangsregister gesetzt od. rückgesetzt.
oder wird das register pausenlos gesetzt und zurückgesetzt, je nach wie groß die zykluszeit des programms ist.
das mit den register und deren verarbeitung. hab ich das nicht getan?
was müsste ich bei diesem programm ändern?
danke
papua

Johnes
08.12.2007, 13:45
So ist es! Du setzt den Ausgang in einem Zyklus und löscht es auch gleich wieder. Dadurch entsteht je Zyklus ein Wechsel.

Ich denke mal, du hast schon mal mit einer SPS gearbeitet!? Dort ist es so, dass am Anfang die I/O's abgefragt werden und dann bearbeitet werden. Am Ende des Zyklus werden dann die I/O's gesetzt.

Der Atmel kann jeder Zeit die I/O's ändern. Auch innerhalb des Zyklus.

Programmtechnisch musst du dein Prog also so ändern, dass du bevor du deine I/O's mittels OUT setzt, alle Bearbeitungen machst!

MfG[/code]

papuadive
11.12.2007, 12:52
danke, ist mir jetzt klar...
bezüglich programmverbesserung, könntest du mir es verbessern, weiß nämlich nichts genau, was du meinst....
danke papua