Hallo, vielleicht kann mir jemand weiterhelfen? Bei meinem Atmega88 verhält sich PORTB anders als PORTC. Mit dem PORTC steuer ich die Schaltung einer 4-stelligen 7-Segment-LED-Anzeige an. Die Schaltung mit gemeinsamer Anode wie hier auf den Seiten im Tutoral abgebildetet ist. Sobald ich die Segmente auf dem PORTB umlege und dann PORTB wie PORTC ansteuere, passiert nichts mehr. Alle PORTs habe ich als Ausgänge und gleich initialisiert. Trotz aller Bemühungen im Atmega88 Handbuch etwas über die Unterschiede oder ähnliches zu finden, habe ich bisher keine Lösung für mein Problem gefunden. Zu aller letzt habe ich auch schon den Controller gegen neue ausgetauscht (unbenutzte) und bin zur simplen Programmierung mittel cbi und sbi der einzelnen PORT-Ausgänge übergegangen. Alle nicht benötigten Programmteile abgeschaltet und nur doch statische Ansteuerungen immer wieder in verschiedenen Varianten (Bit-Muster) in den Controller eingespielt. Mit PORTB bekomme ich kein vernünftiges LOW-Signal hin, High-Pegel sind in Ordnung nur die Low-Pegel liegen irgendwo dazwischen. Programmieradapter ist dann auch nicht angeschlossen. Beim Programmieren sind aktivietäten auf der Anzeige zu sehen, was darauf hinweist, das etwas mit meinen Signalen aus dem Controller im Normalbetrieb nicht stimmt. Gibt es Unterschiede in der Hard- oder Software bei als Ausgängen geschaltete PORTB und PORTC? HIERMIT FUNKTIONIERT DIE ANZEIGE: ldi tmp, 0b11111111 ; PortB (0-Input, 1-Output) out DDRB, tmp out DDRC, tmp out DDRD, tmp sbi PORTD, 4 ; Anzeige 1 anwählen sbi PORTD, 5 ; Anzeige 2 anwählen cbi PORTD, 6 ; Anzeige 3 anwählen cbi PORTD, 7 ; Anzeige 4 anwählen cbi PORTC, 0 ; Segment a anwählen sbi PORTC, 1 ; Segment b anwählen cbi PORTC, 2 ; Segment c anwählen sbi PORTC, 3 ; Segment d anwählen cbi PORTC, 4 ; Segment e anwählen sbi PORTC, 5 ; Segment f anwählen cbi PORTC, 6 ; Segment g anwählen sbi PORTC, 7 ; Segment DP anwählen HIERMIT FUNKTIONIERT DIE ANZEIGE NICHT: ldi tmp, 0b11111111 ; PortB (0-Input, 1-Output) out DDRB, tmp out DDRC, tmp out DDRD, tmp sbi PORTD, 4 ; Anzeige 1 anwählen sbi PORTD, 5 ; Anzeige 2 anwählen cbi PORTD, 6 ; Anzeige 3 anwählen cbi PORTD, 7 ; Anzeige 4 anwählen cbi PORTB, 0 ; Segment a anwählen sbi PORTB, 1 ; Segment b anwählen cbi PORTB, 2 ; Segment c anwählen sbi PORTB, 3 ; Segment d anwählen cbi PORTB, 4 ; Segment e anwählen sbi PORTB, 5 ; Segment f anwählen cbi PORTB, 6 ; Segment g anwählen sbi PORTB, 7 ; Segment DP anwählen Irgendwie seltsam!
An PortB liegen auch die SPI-Leitung, evtl. Programmieradapter abstöpseln...
Der Controller steckt aber nicht zufällig im STK500? Wg. Takt an PB6/7.
Kein STK500, sondern eigenständige Schaltung (Controller und Steckanschlüße, also nackt) in mehrfacher und getesteter Ausführung. Schaltungsaufbau auch schon mehrmals geprüft, alles in Ordnung. Funktionstest immer ohne Programmieradapter. Programmieradapter ist eine steckbare Version und kein Board wie das STK500. Problem ist eigentlich, das ich PORTB noch nie als Ausgang wie PORTC oder PORTD betreiben konnte und früher daher diesen als Eingang genutzt habe. Egal welche Schaltung ich verwende, über PORTB leuchten einfache LED-Ansteuerungen (LED und Widerstand) nur Schwach. Sind aber Grundsätzlich steuerbar (Ein, Aus), also das PORTB reagiert schon auf die Befehle wie cbi und sbi. An den anderen PORTs leuchten die einfachen LED-Ansteuerungen sehr hell. Meine Programmierung erfolgt ausnahmslos in Assembler. Gründe für dieses Verhalten des PORTB habe ich trotzt (geht schon über Wochen so) lesen der Atmega88 Befehlsliste und der Hardwarebeschreibung nicht finden können.
Hast du einen Schaltplan? Geht es sowohl wenn du die LED gegen GND schaltest als auch gegen VCC nicht? Steigt die Stromaufnahme?
Ich würde mal ALLE VCC und GND anschliessen. Gehst du evtl. nur über AVCC rein?
Ist es völlig egal an welchem Pin von PORTB Du eine LED anschließt? Leuchtet sie an allen Pins nur schwach? Versuche es mal mit nur EINER LED an allen Pins der Reihe nach. Wie sind die Fuses programmiert? Die komplette Schaltung und das komplette Programm können auch nicht schaden. Viele Grüße
Hallo, holger schrieb: > Ich würde mal ALLE VCC und GND anschliessen. > Gehst du evtl. nur über AVCC rein? Genau sowas würde ich auch vermuten... Irgendwo fehlt entweder die Spannung oder ein GND. Gruß aus Berlin Michael
Habe den Fehler gefunden, nach ein paar Überlegungen über Hardware und Pull-Up Widerstände bin ich auf die Vermutung gestoßen, das eventuell eine falsche Adresse beschrieben wird. Darauf hin habe ich mir meine "m88def.inc" überprüft, und mußte feststellen,das ein Wert in der Zuweisung nicht in Ordnung war. Habe den Wert korrigiert und jetzt läuft alles wie gewollt. Warum dort ein falscher Wert stand ist mir Rätselhaft. Kleine Ursache große Wirkung. Entschuldigung, das ich hier eine so blöde Frage gestellt habe. Hätte lieber noch etwas warten sollen! Meine Testroutine läuft: ;******************************************************************** ; ; .nolist .include "m88def.inc" ; .list ;-------------------------------------------------------------------- ; Register ;-------------------------------------------------------------------- ;.................................................................... ; r0 bis r15 werden als Hilfsregister verwendet ;.................................................................... ; .def = r0 ; Low-Rechenregister ; .def = r1 ; High-Rechenregister ; .def = r2 ; ... ; .def = r3 ; ... ; .def = r4 ; ... ; .def = r5 ; ... ; .def = r6 ; ... ; .def = r7 ; ... ; .def = r8 ; ... ; .def = r9 ; ... .def ziffer1 = r10 ; Einerstelle .def ziffer2 = r11 ; Zehnerstelle .def ziffer3 = r12 ; Hunderterstelle .def ziffer4 = r13 ; Tausenderstelle ; .def = r14 ; ... ; .def = r15 ; ... .def tmp = r16 ; Temporary variable .def timer = r17 ; Zeitzähler a 250µs .def status = r18 ; Statusbits Gangzählung .def segm = r19 ; Segmentzähler LED-Anzeige ; .def = r20 ; ... ; .def = r21 ; ... ; .def = r22 ; ... ; .def = r23 ; ... ; .def = r24 ; ... ; .def = r25 ; r26/r27 X-Register ; r28/r29 Y-Register ; r30/r31 Z-Register ;******************************************************************** ; Org ;******************************************************************** .cseg .org $0000 ;******************************************************************** ; Interruptroutinen ;******************************************************************** ;-------------------------------------------------------------------- ; Sprungvektoren fuer Reset und Interrupts ;-------------------------------------------------------------------- rjmp RESET ; Reset Handler reti ; rjmp EXT_INT0 ; IRQ0 Handler PD2 reti ; rjmp EXT_INT1 ; IRQ1 Handler PD3 reti ; rjmp PCINT0 ; PCINT0 Handler reti ; rjmp PCINT1 ; PCINT1 Handler reti ; rjmp PCINT2 ; PCINT2 Handler reti ; rjmp WDT ; Watchdog Timer Handler reti ; rjmp TIM2_COMPA ; Timer2 Compare A Handler reti ; rjmp TIM2_COMPB ; Timer2 Compare B Handler reti ; rjmp TIM2_OVF ; Timer2 Overflow Handler reti ; rjmp TIM1_CAPT ; Timer1 Capture Handler reti ; rjmp TIM1_COMPA ; Timer1 Compare A Handler reti ; rjmp TIM1_COMPB ; Timer1 Compare B Handler reti ; rjmp TIM1_OVF ; Timer1 Overflow Handler reti ; rjmp TIM0_COMPA ; Timer0 Compare A Handler reti ; rjmp TIM0_COMPB ; Timer0 Compare B Handler rjmp TIM0_OVF ; Timer0 Overflow Handler reti ; rjmp SPI_STC ; SPI Transfer Complete Handler reti ; rjmp USART_RXC ; USART, RX Complete Handler reti ; rjmp USART_UDRE ; USART, UDR Empty Handler reti ; rjmp USART_TXC ; USART, TX Complete Handler reti ; rjmp ADC ; ADC Conversion Complete Handler reti ; rjmp EE_RDY ; EEPROM Ready Handler reti ; rjmp ANA_COMP ; Analog Comparator Handler reti ; rjmp TWI ; 2-wire Serial Interface Handler reti ; rjmp SPM_RDY ; Store Program Memory Ready Handler ;-------------------------------------------------------------------- ; Resetroutine ;-------------------------------------------------------------------- RESET: ;.................................................................... ; Stackpointer Initialisieren ;.................................................................... ldi tmp, high(RAMEND); Set Stack Pointer to top of RAM out SPH, tmp ; Initialize stackpointer for parts with SW stack ldi tmp, low(RAMEND) out SPL, tmp ;.................................................................... ; Ports initialisieren ;.................................................................... ldi tmp, 0b11111111 ; PortB (0-Input, 1-Output) out DDRB, tmp ; ldi tmp, 0b00001111 ; Internen Pul-Up Widerstand (1-Ein, 0-Aus) ; out PORTB, tmp ; ldi tmp, 0b11111111 ; Internen Pul-Up Widerstand (1-Ein, 0-Aus) ; out PORTC, tmp ldi tmp, 0b11111111 ; PortC (0-Input, 1-Output) out DDRC, tmp ; ldi tmp, 0b11110011 ; Internen Pul-Up Widerstand (1-Ein, 0-Aus) ; out PORTD, tmp ldi tmp, 0b11111111 ; PortD (0-Input, 1-Output) out DDRD, tmp ;.................................................................... ; Interrupt Vektor Select - Flash Memory or Flash Boot ;.................................................................... ldi tmp, (1<<IVCE) ; IVCE - Interrupt Vector Change enable out MCUCR, tmp ; MCUCR - MCU Control Register ldi tmp, (0<<IVSEL) ; IVSEL - Interrupt Vector select (Flash) out MCUCR, tmp ;.................................................................... ; Timer/Counter0 initialisieren (8bit) (clk/8 => 2,048ms) ;.................................................................... ldi tmp, 0b00000000 ; Normal port operation, OC0A/OC0B disconnected out TCCR0A, tmp ; Timer/Counter0 Control Register A ldi tmp, 0b00000010 ; Mode of Operation = Normal and clk/8 (prescaler) out TCCR0B, tmp ; Timer/Counter0 Control Register B ldi tmp, 0b00000001 ; Timer/Counter0 Overflow Interrupt Enable sts TIMSK0, tmp ; Timer/Counter0 Interrupt Mask Register ;.................................................................... ; Freigabe Interrupts und Initialisierung beenden ;.................................................................... sei ; Enable global interrupt (Bit7 im SREG) rjmp MAIN ;-------------------------------------------------------------------- ; Timer0 Overflow Handler (8bit) (clk/8 => 2,048ms) ;-------------------------------------------------------------------- TIM0_OVF: push tmp in tmp, SREG ; Save global interrupt flag push tmp ;.................................................................... ; Zeitzähler je 2,048ms ;.................................................................... inc timer ; Zeitzähler +1 ;.................................................................... pop tmp out SREG, tmp ; Restore global interrupt flag pop tmp reti ;******************************************************************** ; Hauptprogramm ;******************************************************************** MAIN: ;.................................................................... ; Timer auswerten 4ms ;.................................................................... sbrs timer, 7 ; 4ms rjmp eins_end cbi PORTD, 0 ; Segment a anwählen sbi PORTD, 1 ; Segment b anwählen cbi PORTD, 2 ; Segment c anwählen sbi PORTD, 3 ; Segment d anwählen cbi PORTD, 4 ; Anzeige 1 anwählen sbi PORTD, 5 ; Anzeige 2 anwählen cbi PORTD, 6 ; Anzeige 3 anwählen sbi PORTD, 7 ; Anzeige 4 anwählen cbi PORTB, 0 ; Segment a anwählen sbi PORTB, 1 ; Segment b anwählen cbi PORTB, 2 ; Segment c anwählen sbi PORTB, 3 ; Segment d anwählen cbi PORTB, 4 ; Segment e anwählen sbi PORTB, 5 ; Segment f anwählen cbi PORTB, 6 ; Segment g anwählen sbi PORTB, 7 ; Segment . anwählen cbi PORTC, 0 ; Segment a anwählen sbi PORTC, 1 ; Segment b anwählen cbi PORTC, 2 ; Segment c anwählen sbi PORTC, 3 ; Segment d anwählen cbi PORTC, 4 ; Segment e anwählen sbi PORTC, 5 ; Segment f anwählen ; cbi PORTC, 6 ; Segment g anwählen ; sbi PORTC, 7 ; Segment . anwählen rjmp MAIN eins_end: sbi PORTD, 0 ; Segment a anwählen cbi PORTD, 1 ; Segment b anwählen sbi PORTD, 2 ; Segment c anwählen cbi PORTD, 3 ; Segment d anwählen sbi PORTD, 4 ; Anzeige 1 anwählen cbi PORTD, 5 ; Anzeige 2 anwählen sbi PORTD, 6 ; Anzeige 3 anwählen cbi PORTD, 7 ; Anzeige 4 anwählen sbi PORTB, 0 ; Segment a anwählen cbi PORTB, 1 ; Segment b anwählen sbi PORTB, 2 ; Segment c anwählen cbi PORTB, 3 ; Segment d anwählen sbi PORTB, 4 ; Segment e anwählen cbi PORTB, 5 ; Segment f anwählen sbi PORTB, 6 ; Segment g anwählen cbi PORTB, 7 ; Segment . anwählen sbi PORTC, 0 ; Segment a anwählen cbi PORTC, 1 ; Segment b anwählen sbi PORTC, 2 ; Segment c anwählen cbi PORTC, 3 ; Segment d anwählen sbi PORTC, 4 ; Segment e anwählen cbi PORTC, 5 ; Segment f anwählen ; sbi PORTC, 6 ; Segment g anwählen ; cbi PORTC, 7 ; Segment . anwählen rjmp MAIN ;******************************************************************** ; *** EOF *** ;********************************************************************
>Darauf hin habe ich mir meine >"m88def.inc" überprüft, und mußte feststellen,das ein Wert in der >Zuweisung nicht in Ordnung war. Wo genau?
Hi >>Darauf hin habe ich mir meine >>"m88def.inc" überprüft, und mußte feststellen,das ein Wert in der >>Zuweisung nicht in Ordnung war. >Wo genau? Das möchte ich auch mal sehen. MfG Spess
Der Wert für ".equ DDRB = 0x04" war verändert. Warum das bei mir so war, ist mir ein Rätsel. Kann mir nicht vorstellen, das andere dort ein Problem haben werden, da ich anscheinend der erste war, der ein PORTB Problem mit dem Verhalten, wie weiter oben geshildert, hatte. Ich ändere an dieser Datei nichts. Ansehen nur über eine duplizierte Datei!
Hallo, John schrieb: > Ich ändere an dieser Datei nichts. Ansehen nur über eine duplizierte > Datei! Na, wenn Du selbstverändernde Dateien auf Deinem Rechner hast, würde ich das Studio lieber neu installieren, wer weiß, was sich da noch geändert hat... Gruß aus Berlin Michael
>Na, wenn Du selbstverändernde Dateien auf Deinem Rechner hast, würde ich >das Studio lieber neu installieren, wer weiß, was sich da noch geändert >hat... Ich würde darüber nachdenken eine neue Festplatte zu kaufen. Wenn da schon Daten von alleine umkippen wird es höchste Zeit.
Hi Um ehrlich zu sein: Das sich die Datei selbst verändert und das du das findest, sind für mich zu viele Unwahrscheinlichkeiten. MfG Spess
Hallo John, benutze folgende Schaltung um ein leichtes Leuchten der nicht angesteuerten Segmente (siehe Bild) zu unterdrücken. Wahrscheinlich hast Du HDSP5551 rot eingesetzt. Habe für die Segmente 220er genommen. Hatte mal ein ähnliches Symtom mit der *.inc Dateien. Kann nur sagen, melde dich bei Atmel an und lade nur von dort dein Studio runter! Schöner Aufbau deines Programms, auch wenn es nur zum Testen dienen sollte. Werde vielleicht mal einen Quellcode in Deinem Still nachschicken. Mal sehen wie viel Zeit mir dafür bleibt. Bis bald. Jan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.