- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Beginner Code korrigieren

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2008
    Beiträge
    20
    Anzeige

    Powerstation Test
    Was meinst du mit Toggeln des Port-Ausgangs? Umschalten zwischen Ein- und Ausgang?
    Das versteh ich nicht ganz:
    Du liest diesen Wert auch dann, wenn der PORTx nicht als Ausgang geschaltet ist (dann wird natürlich dadurch der jeweilige Pullup-R aktiviert, wenn das zugehörige PORTx-Bit gesetzt ist).
    Gibt es noch was anderes Als Ein- und Ausgang. Direkt nach einem Reset ist ein Port dann auf Ein- oder auf Ausgang gechaltet?

    Also ich verstehe das jetzt so:
    Auf Eingang schreiben -> Pullup an/aus
    Am Ausgang lesen -> man bekommt den Wert den der Ausgang gerade hat

    Hier mal die überarbeitete Version meines Codes:
    Code:
    ;+++++++++++++++++++++++++++
    ;My first AVR ASSEMBLY CODE
    ;+++++++++++++++++++++++++++
    
    ;################
    .NOLIST
    .INCLUDE "m8def.inc"
    .LIST
    ;################
    
    .EQU Taster1     = 2
    .EQU LED1        = 5
    
    RJMP   main
    
    main:
    	LDI     R16,0b00100000		
    	OUT     DDRD,R16                ;PORT D Input/Output directions setzen
    
    	SBIC    PIND,Taster1            ;Taster1 prüfen
    	RJMP    led_on                  ;springen wenn gedrückt        
    
            CBI     PORTD,LED1              ;LED1 ausschalten
    	RJMP    main
    led_on:
    	SBI   	PORTD,LED1              ;LED1 anschalten
    	RJMP    main
    Als nächstes werde ich mal versuchen die LEDs zum blinken zu bringen.

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo,

    Zitat Zitat von onion
    Was meinst du mit Toggeln des Port-Ausgangs? Umschalten zwischen Ein- und Ausgang?
    nein, Umschalten von H nach L bzw. von L nach H.

    Gibt es noch was anderes Als Ein- und Ausgang. Direkt nach einem Reset ist ein Port dann auf Ein- oder auf Ausgang gechaltet?
    Ich versuche es kurz zu erklären, aber diese Erklärung ersetzt nicht das Datenblatt (verlinkt!), das zu Deiner Pflichtlektüre werden muss.

    Laut Datenblatt ist "0" der Initialwert für DDRx und PORTx, also ist jeder Hardware-Pin zunächst einmal ein Eingang ohne Pullup-R. Du würdest von PORTD und DDRD direkt nach einem Power-On-Reset z.B. "0" lesen. Von "PIND" liest Du hingegen das, was Du hardwaremäßig an den zugehörigen Hardware-Pins liegen hast. Oft will man Pins mit z.B. Tastern auf "0" ziehen. Um einen externen Pullup-R zu sparen, aktiviert man den internen durch Schreiben von PORTx/Py (z.B. so:
    Code:
    clr r16             ;
    out DDRD, r16 ; redundant nach einem Reset!  D als Eingang
    sbi PORTD,0    ; aktiviere Pullup-R für PD0
    nop                ; ist hier nötig, da die Änderung erst 1 Takt später erfolgt!
    in r17, PIND    ; r17 Bit0 ist jetzt gesetzt, wenn PD0 offen (int. Pullup)!
    Achtung: nicht bei allen ATmegas kannst Du alle SFRs mit "in/out/sbi/cbi etc." ansprechen, z.T. muss man das mit LDS/STS machen, wenn das jeweilige SFR "memory mapped" ist! Wann gilt das? Siehe Datenblatt des μCs!

    Auf Eingang schreiben -> Pullup an/aus
    Nein, s.o., auf PORTX/PY eine "1"schreiben => Pullup-R für das Bit PY von PORTX.

    Am Ausgang lesen -> man bekommt den Wert den der Ausgang gerade hat
    Nein, wenn Du PORTX liest, bekommst Du den Wert, der in PORTX steht, also den Initialwert oder den Wert, den Du reingeschrieben hast. Wenn Du PINX liest, bekommst Du das, was durch PORTX und die Hardware vorgegeben ist. Wäre allerdings blöd, DDRD und PORTD auf 0xff zu setzen und alle Pins auf Masse zu legen (Kurzschluss!).

    Deinen Code sehe ich mir erst an, wenn Du das Datenblatt gelesen und verdaut hast. [-(

    Viele Grüße

    Fred
    Only entropy comes easy. - Anton Checkhov

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2008
    Beiträge
    20
    Also ich arbeite schon mit dem Datenblatt, jedoch picke ich mir eher immer die Infos raus die ich gerade brauche. Befehlsübersicht etc.
    Da ich aber von manchen Dingen gar nicht weiß, dass sie exestieren, ist das dann manchmal etwas schwierig. Und so 300 Seiten arbeitet man jetzt auch nicht so in ner Stunde mal eben durch.
    Ich finde als Anfänger sollte man erst mal so 2 bis 3 kleine Programme geschrieben haben z.b. mit Hilfe von Tutorials oder so netten Foren wie hier und dann kann man sich voll ins Datenblatt stürzen.

    Mein Code funktioniert jetzt aber und ist denke ich auch ok so wie ich es gemacht habe.
    Final Version:
    Code:
    ;+++++++++++++++++++++++++++
    ;My first AVR ASSEMBLY CODE
    ;+++++++++++++++++++++++++++
    
    ;################
    .NOLIST
    .INCLUDE "m8def.inc"
    .LIST
    ;################
    
    .EQU Taster1     = 2
    .EQU LED1        = 5
    
    RJMP   main
    
    main:
    	LDI     R16,(1<<LED1)		
    	OUT     DDRD,R16                ;PORT D Input/Output directions setzen
    loop:
    	SBIC    PIND,Taster1            ;Taster1 prüfen
    	RJMP    led_on                  ;springen wenn gedrückt        
    
           CBI     PORTD,LED1              ;LED1 ausschalten
    	RJMP    loop
    led_on:
    	SBI   	PORTD,LED1              ;LED1 anschalten
    	RJMP    loop

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Zitat Zitat von onion
    ..., ist das dann manchmal etwas schwierig. Und so 300 Seiten arbeitet man jetzt auch nicht so in ner Stunde mal eben durch.
    Stimmt.

    Mein Code funktioniert jetzt aber und ist denke ich auch ok so wie ich es gemacht habe.
    Kommentierte Version:
    Code:
    ;################
    .NOLIST
    .INCLUDE "m8def.inc"
    .LIST
    
    .EQU Taster1     = 2
    .EQU LED1        = 5
    
    .CSEG       ;
    .ORG 0      ; 
    
    RJMP   main ; könntest Du in diesem Fall sogar weglassen
    
    main:
    	LDI     R16, (1<<LED1)  ; GUT!		
    	OUT    DDRD, R16         ; GUT!
    loop:
    	SBIC    PIND,Taster1        ;Taster1 prüfen
    	RJMP    led_on                  ;led_on wenn TasterPin=H
        CBI PORTD,LED1              ;LED1 ausschalten wenn TasterPin=L
    	RJMP    loop
    
    led_on:
    	SBI  PORTD,LED1              ;LED1 anschalten
    	RJMP    loop
    Du sagtest, Dein Taster schaltet PD2 bei Aktivierung auf Masse? Dann bekommst Du das, was ich in den Code kommentiert habe, es sei denn, die LED liegt zwischen Ausgangspin und Vcc (ich weiß nicht, wie Deine Hardware aussieht); dann wäre aber "led_on" falsch bezeichnet.

    Viele Grüße und weiter viel Spaß mit Assembler!

    Fred
    Only entropy comes easy. - Anton Checkhov

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2008
    Beiträge
    20
    Das habe ich oben gesagt:
    Also im Schaltplan Ist es Taster1 verbunden mit PD2 (IC4 ist der atmega und LED 1 verbunden mit PD5. Der Taster ist gegen 5V geschaltet und die LED ist mit einem Widerstand auf Masse geschaltet.
    Übringens gibts den Link zum Schaltplan oben in meinem ersten Posting, falls du es dir anschauen möchtest.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hi,

    tut mir leid, dass ich das nicht berücksichtigt hatte. Im Schaltplan habe ich jetzt auch endlich den PD2-Taster gefunden; anfangs hatten mich die Tabellen mit Jumper-Settings usw. total durcheinander gebracht. So ist Dein Code richtig!

    Typischer ist es, die internen Pullup-Rs zu verwenden und gegen Masse zu schalten. Was Dein Board macht, ist natürlich auch nicht verkehrt, obwohl viele über die R/C-Kombination zur "Entprellung" die Nase rümpfen würden.

    BTW: Die AVRs aus "alten Zeiten" (AT90Sxxxx-Serie) konnten mehr Strom "sinken" als "sourcen", deshalb wurden dort LEDs meist vom Ausgangspin nach Vcc geschaltet.

    Viele Grüße

    Fred
    Only entropy comes easy. - Anton Checkhov

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2008
    Beiträge
    20
    Nunja, das Board hab ich mir halt einfach mal von Pollin bestellt um einen Einstiegspunkt zu haben. Ich fand 14,95 Eur ist ein ganz guter Preis dafür.
    Besser wäre natürlich noch ein USB Anschluss aber das würde dann halt direkt das 3 fache kosten und irgendwann werd ich mir das vielleicht einfach selber bauen.
    Wie würde man denn überlicherweise einen Taster verschalten um ihn zu entprellen. Warum ist die Pollin Lösung schlecht?

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hi,

    Zitat Zitat von onion
    .... Ich fand 14,95 Eur ist ein ganz guter Preis dafür...
    Sehe ich auch so!

    ...Wie würde man denn überlicherweise einen Taster verschalten um ihn zu entprellen.
    Internen Pullup-R aktivieren und prellenden Taster gegen Masse. Dann per Software entprellen! Es gibt sogar ICs, die entprellen. Hier die "Bibel" zum Thema Prellen und Entprellen.

    Warum ist die Pollin Lösung schlecht?
    • 1. Fehlende Flexibilität, da "fester" Pulldown-R (wird auf Deinem Board durch Jumper umgangen!)
      2. Unnötiger Hardware-Aufwand (33k + 330nF)
      3. Fragliche Wirksamkeit (siehe oben zitierten "Bibel"-Link)


    MfG

    Fred
    Only entropy comes easy. - Anton Checkhov

  9. #19
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Hallo alle, hi onion,

    Zitat Zitat von onion
    Also ich arbeite schon mit dem Datenblatt, jedoch picke ich mir eher immer die Infos raus die ich gerade brauche. ...
    Ja, das kenne ich (auch von mir) - - - man weiss nur soo oft nicht, welche Stellen man kennen müsste - wenn man die nicht gelesen hat. Das ist eben das doofe an den Datenblättern - man sollte sie wenigstens einmal durchlesen. Merken kann man sich das bei späterem, nochmaligen Durchlesen.

    Zitat Zitat von onion
    ... Wobei ich mich gerade auch mal gefragt habe wie oft ich den Chip überhaupt flashen kann bevor ich einen neuen brauche.
    Das steht im Datenblatt, übrigens auf Seite 1, ziemlich oben . . . .
    – Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
    Ciao sagt der JoeamBerg

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2008
    Beiträge
    20
    Also, weiter gehts, leider will die LED partout nicht blinken.
    Sie geht nur einmal an und das auch nur nach viel zu langer Zeit, eigentliche frequenz sollte 1Hz sein.
    Vielleicht habt ihr ja noch mal nen Tipp, habe versucht den Code so gut wie möglich zu kommentieren:
    Code:
    ;******************************************************************
    ;Trying to make the LED blink
    ;******************************************************************
    
    ;*******************
    .NOLIST
    .INCLUDE "m8def.inc"
    .LIST
    ;*******************
    
    .EQU Taster1            = 2
    .EQU LED1               = 5
    .EQU Timer_Start_Wert   = 65536 - 15625
    
    main:
    	LDI     R16,(1<<LED1)
    	OUT     DDRD,R16                        ;PORT D Input/Output directions setzen
            LDI     R16,(1<<CS12)+(1<<CS10)         ;Prescaller für Timer1 auf 1024 setzen, 16MHz/1024 = 15625Hz
            OUT     TCCR1B,R16
    outer_loop:
            LDI     R16,HIGH(Timer_Start_Wert)      ;Startwert in Timer laden, Timer soll ein mal pro Sekunde überlaufen
            OUT     TCNT1H,R16
            LDI     R16,LOW(Timer_Start_Wert)
            OUT     TCNT1L,R16
    inner_loop:
            IN      R16,TIFR                        ;auf Overflow des Timer1 warten
            SBRS    R16,TOV1
            RJMP    inner_loop
    
            IN      R16,PORTD                       ;LED Zustand einlesen
            COM     R16                             ;toggeln
            ANDI    R16,(1<<LED1)
            OUT     PORTD,R16                       ;wieder ausgeben
            RJMP    outer_loop                      ;zurück zum Timer reseten

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests