-         

Ergebnis 1 bis 7 von 7

Thema: Programm funktioniert nicht richtig!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78

    Programm funktioniert nicht richtig!

    Anzeige

    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?
    Code:
    .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

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78
    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

  4. #4
    Benutzer Stammmitglied Avatar von Johnes
    Registriert seit
    07.12.2007
    Ort
    Neu Wu
    Beiträge
    44
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78
    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

  6. #6
    Benutzer Stammmitglied Avatar von Johnes
    Registriert seit
    07.12.2007
    Ort
    Neu Wu
    Beiträge
    44
    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]

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78
    danke, ist mir jetzt klar...
    bezüglich programmverbesserung, könntest du mir es verbessern, weiß nämlich nichts genau, was du meinst....
    danke papua

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •