Forum: Mikrocontroller und Digitale Elektronik PULLUP beim Tiny13


von Rolf H. (flash01)


Lesenswert?

Hallo Leute,
ich lese nun schon in meinem schlauen Buch, wie ich z.B.
PORTB,B4 einen PULLUP Widerstand in Assembler aktiviere.
Sehe hier den Befehl:
sbi   PORTB,PB4
aber das haut nicht hin.
Grüße

Rolf

von (prx) A. K. (prx)


Lesenswert?

Ist dieser eine Befehl das ganze Programm?

von Winnie (Gast)


Lesenswert?

Was "haut" denn nicht hin?
Meckert der Assembler (Syntax müsste eigentlich sein: sbi PortB, 4) oder 
funktioniert es auf dem Controller nicht?

von Vlad T. (vlad_tepesch)


Lesenswert?

A. K. schrieb:
> Ist dieser eine Befehl das ganze Programm?
er will darauf hinaus, ob am ende eine Endlosschleife kommt, oder ob der 
Tiny munter eine Reset -> 1 Befehl-Programm -> Reset Schleife läuft

von Rolf H. (flash01)


Lesenswert?

so sieht der Quelltext aus:

        .INCLUDE  "tn13def.inc"  ; Deklarationen für Tiny13
        .EQU    takt = 1000000  ; Systemtakt 1 MHz
        .DEF    akku = r16      ; Arbeitsregister r16 in akku benannt
        .CSEG                   ; Programm-Flash
        rjmp    start           ; Reset-Einsprung
        .ORG    $6              ; Interrupt-Einsprünge übergehen
start:  ldi     akku,LOW(RAMEND); Stapel anlegen
        out     SPL,akku        ;

        ldi     akku,0b00000111       ; Bitmuster 0000 0111
         out     DDRB,akku       ; PortB (PB0-PB2) ist Ausgang
                                 ;PB3-PB7 ist Input
        sbi     PORTB, 3



loop:  nop
sw1:  sbic  PINB,PB3
    rjmp  sw1
    ldi     akku,$07        ; Bitmuster 0000 0111
        out     PORTB,akku      ; Ausgabe Anschluss Port

        rjmp    loop            ; Schleife
        .EXIT                   ; Ende des Quelltextes


Der Befehl sbic wird einfach ignoriert!

von Karl H. (kbuchegg)


Lesenswert?

Rolf Hegewald schrieb:

> Der Befehl sbic wird einfach ignoriert!

Der wird mit SIcherheit nicht ignoriert.

Diese Attitüde kannst du dir gleich wieder abschminken. Wenn dein 
Progrmm nicht so funktioniert, wie du dir das vorstellst, dann liegt es 
immer am Programmierer. Entweder ist seine Vorstellung falsch oder er 
hat nicht das programmiert, was er eigentlich programmieren wollte.


Woran erkennst du denn, dass nichts geht?
Was sollte denn passieren und was passiert statt dessen?

von (prx) A. K. (prx)


Lesenswert?

Der Pullup wird nach dem
   out     PORTB,akku
in der Schleife garantiert nicht mehr up-pullen.

von Vlad T. (vlad_tepesch)


Lesenswert?

die anfangs genannte Zeile taucht auch nirgends im Programmn auf, oder 
hab ich tomaten auf den augen?

von Hannes L. (hannes)


Lesenswert?

Vlad Tepesch schrieb:
> tomaten auf den augen?

So schlampig formatierte Quelltexte kann man doch gar nicht lesen, davon 
bekommt man Augenkrebs. Ein bissel Disziplin sollte schon sein, wenn man 
Hilfe erwartet.

...

von Ben S. (theben)


Lesenswert?

Zum Test vielleich einfach mal sbic gegen sbis eintauschen.

von Rolf H. (flash01)


Lesenswert?

Hallo Karl Heinz,
 "Was sollte denn passieren, und was passiert stattdessen"

loop:  nop
sw1:   sbic  PINB,PB3
       rjmp  sw1
       ldi     akku,$07        ; Bitmuster 0000 0111
       out     PORTB,akku      ; Ausgabe Anschluss Port

       rjmp    loop            ; Schleife
       .EXIT                   ; Ende des Quelltextes

wenn ich ändere:

       ldi     akku,$00
       out     PORTB,akku
       rjmp    loop
dann dürften PB0-PB2 erst dann zu LOW gehen, wenn ich die
Taste sw1 drücke, oder? wo ist denn hier mein Denkfehler!
Tut der Tiny aber nicht und alle 3 Pins haben LOW

Grüße

Rolf

von Walter S. (avatar)


Lesenswert?

A. K. schrieb:
> Der Pullup wird nach dem
>    out     PORTB,akku
> in der Schleife garantiert nicht mehr up-pullen.

Hallo Rolf,

Lies doch einfach was man dir schreibt

von Rolf H. (flash01)


Lesenswert?

sorry Walter,
jetzt haut es hin.
Nochmals den Quelltext:

       .INCLUDE  "tn13def.inc"  ; Deklarationen für Tiny13
        .EQU    takt = 1000000  ; Systemtakt 1 MHz
        .DEF    akku = r16      ; Arbeitsregister r16 in akku benannt
        .CSEG                   ; Programm-Flash
        rjmp    start           ; Reset-Einsprung
        .ORG    $6              ; Interrupt-Einsprünge übergehen

start:  ldi     akku,LOW(RAMEND); Stapel anlegen
        out     SPL,akku        ;
        ldi     akku,0b00000111       ; Bitmuster 0000 0111
        out     DDRB,akku       ; PortB (PB0-PB2) ist Ausgang
        sbi     PORTB,PB3


loop:  nop

sw1:  sbic   PINB,PB3
      rjmp   sw1
      ldi    akku,7        ; Bitmuster 0000 0111
      out    PORTB,akku    ; PB0-PB2 = High
      rjmp   loop            ; Schleife
       .EXIT                   ; Ende des Quelltextes
bei Änderung von akku wird der neue Wert erst dann übernommen,
wenn die Taste sw1 gedrückt wird.

Danke nochmals an Alle für Eure Hilfe.

Grüße

Rolf

von (prx) A. K. (prx)


Lesenswert?

Rolf Hegewald schrieb:

>       ldi    akku,7        ; Bitmuster 0000 0111
>       out    PORTB,akku    ; PB0-PB2 = High

Der Controller ist trotz all deiner diesbezüglichen Anstrengungen 
garantiert viel sturer als du. Versprochen!

von Hannes L. (hannes)


Lesenswert?

Rolf Hegewald schrieb:
> sbi     PORTB,PB3

Hiermit setzt Du das Bit 3 in PortB.

Rolf Hegewald schrieb:
> ldi    akku,7        ; Bitmuster 0000 0111
> out    PORTB,akku    ; PB0-PB2 = High

Und hiermit löscht Du es wieder...

Versuche es bitte mal mit Bitmanipulation.

...

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.