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.

