Forum: Mikrocontroller und Digitale Elektronik Bei meinem Atmega88 verhält sich PORTB anders als PORTC


von john (Gast)


Lesenswert?

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!

von john (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Schaltung der LED-Anzeige.

von mario (Gast)


Lesenswert?

An PortB liegen auch die SPI-Leitung, evtl. Programmieradapter 
abstöpseln...

von (prx) A. K. (prx)


Lesenswert?

Der Controller steckt aber nicht zufällig im STK500? Wg. Takt an PB6/7.

von John (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hast du einen Schaltplan? Geht es sowohl wenn du die LED gegen GND 
schaltest als auch gegen VCC nicht? Steigt die Stromaufnahme?

von holger (Gast)


Lesenswert?

Ich würde mal ALLE VCC und GND anschliessen.
Gehst du evtl. nur über AVCC rein?

von Mal sehen (Gast)


Lesenswert?

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

von Jänu (Gast)


Lesenswert?

Vielleicht JTAG Fusebit disablen... Weiss zwar nicht, ob der Atmega88 
ein solches besitzt...
Grüsse

von Michael U. (amiga)


Lesenswert?

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

von John (Gast)


Lesenswert?

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 ***
;********************************************************************

von holger (Gast)


Lesenswert?

>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?

von spess53 (Gast)


Lesenswert?

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

von John (Gast)


Lesenswert?

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!

von Michael U. (amiga)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von spess53 (Gast)


Lesenswert?

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

von Jan von Kölle (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.