Forum: Mikrocontroller und Digitale Elektronik Warnungen im AVR Studio


von Marcel L. (janno)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe hier ein älteres Projekt von:"http://www.uwe-freese.de/"; für 
eine Lüfterrregelung. Beim compilieren bekomme ich 4 Warnungen (siehe 
Bild).
Kann ich die vernachlässigen?
; #####################################################################
; ### Lüfterregelung 1.0 07/2004 (c) Uwe Freese                     ###
; ### http://www.uwe-freese.de                   mail@uwe-freese.de ###
; ###                                                               ###
; ### You can use this program freely, but please always include    ###
; ### this copyright information when you share it.                 ###
; ###                                                               ###
; ### Diese Software kann frei verwendet werden, aber bitte immer   ###
; ### diesen Copyright-Hinweis hinzufügen, wenn es weitergegeben    ###
; ### wird!                                                         ###
; #####################################################################

.CSEG
.ORG 0x00

.include "2313def.inc"

; ------------------ Diese Werte dürfen geändert werden 
------------------

.equ    MotorThrMIN         = 40    ; min. Lüfterleistung x/255 (im 
Bereich 1..254)
                                    ; Muss kleiner als MotorThrMAX sein. 
So einstellen, dass der Motor bei dem Wert nicht stehenbleibt.
.equ    MotorThrMAX         = 254   ; max. Lüfterleistung x/255 (im 
Bereich 1..254)
.equ    MotorThrSTART       = 150   ; Lüfterleistung am Anfang x/255
.equ    anatest_every       = 60    ; alle x Schleifendurchgänge nur 
Temperatur messen
                                    ; ein Schleifendurchgang dauert ca. 
43,5 ms
                                    ; bei Wert von 150 also Messung alle 
6,5 s
                                    ; damit dauert einmal komplett 
herunter (Maximal- zu Minimaldrehzahl) ca. 12,6 Min.
                                    ; damit dauert einmal komplett 
herauf (Minimal- zu Maximaldrehzahl) ca. 5 Min.
                                    ; Der Wert ist abhängig vom 
verwendeten Lüfter. Bei einem Lüfter mit hoher Luftleistung z.B. 200 
nehmen.
                                    ; bei einem Lüfter mit niedriger 
Luftleistung (Papst 4412F/GL) niedrigen Wert nehmen (80).
.equ    STARTUPDELAY        = 60    ; Wie lange am Anfang Motor komplett 
einschalten? (x * 50 ms)

; ------------------ Für die Regelung irrelevante Werte (dürfen geändert 
werden) ------------------

.equ    LEDBLINK_LOOPVAL         =  7   ; in welchem Rythmus blinken 
(Taktverhältnis LEDBLINK_LOOPVAL/LEDBLINK_LOOPVALMAX)
.equ    LEDBLINK_LOOPVALMAX      = 14   ; in welchem Rythmus blinken 
(Taktverhältnis LEDBLINK_LOOPVAL/LEDBLINK_LOOPVALMAX)
.equ    LEDBLINKQUICK_LOOPVAL    =  2   ; in welchem Rythmus blinken 
(Taktverhältnis LEDBLINKQUICK_LOOPVAL/LEDBLINKQUICK_LOOPVALMAX)
.equ    LEDBLINKQUICK_LOOPVALMAX =  4   ; in welchem Rythmus blinken 
(Taktverhältnis LEDBLINKQUICK_LOOPVAL/LEDBLINKQUICK_LOOPVALMAX)

; ------------------ Folgende Werte möglichst nicht ändern 
------------------

;Port B pins
.equ    AIN0            = 0
.equ    AIN1            = 1
.equ    MOTOR           = 5

; Bargraph:
; 0-6 ist PortD Pin 0-6
; 7-8 ist PortB Pin 2-3

;Belegung PortD
; Pin 0 = LED 0 (Bargraph)
; Pin 1 = LED 1 (Bargraph)
; Pin 2 = LED 2 (Bargraph)
; Pin 3 = LED 3 (Bargraph)
; Pin 4 = LED 4 (Bargraph)
; Pin 5 = LED 5 (Bargraph)
; Pin 6 = LED 6 (Bargraph)

;Belegung PortB
; Pin 0 = AIN0
; Pin 1 = AIN1
; Pin 2 = LED 7 (Bargraph)
; Pin 3 = LED 8 (Bargraph)
; Pin 4 = LED 9 (Bargraph) (ROT)
; Pin 5 = Motor-Ausgang
; Pin 6 = Temperatur-Test Pin 0 (Standard = aus)
; Pin 7 = Temperatur-Test Pin 1 (Standard = ein)

; Temperatur-Test-Pins
; normale Einstellung ist: Pin 0 ein, Pin 1 aus
; durch Schalten von beiden Pins auf aus, kann überprüft werden, ob die 
Temperatur gerade "stark" fällt
; durch Schalten von beiden Pins auf ein, kann überprüft werden, ob die 
Temperatur gerade "stark" steigt

; Werte, ab denen die LEDs an sind
.equ    LED0_on_if_higher   = 23
.equ    LED1_on_if_higher   = 46
.equ    LED2_on_if_higher   = 70
.equ    LED3_on_if_higher   = 93
.equ    LED4_on_if_higher   = 116
.equ    LED5_on_if_higher   = 139
.equ    LED6_on_if_higher   = 162
.equ    LED7_on_if_higher   = 185
.equ    LED8_on_if_higher   = 209
.equ    LED9_on_if_higher   = 232

.def    temp                = r16   ; allgemein verwendbare 
temp-Variable
.def    temp2               = r17   ; Level zur Anzeige von 
Geschwindigkeit für 10 LEDs (0..10)
.def    mydelay             = r18
.def    startuploopcounter  = r19
.def    motorloopcounter    = r20   ; Motor-Schleifenzähler
.def    MotorThr            = r21   ; momentaner Wert, bis zu dem Motor 
ein ist
.def    anatest_loop        = r22
.def    history             = r23   ; von den letzten 8 Messungen 
abspeichern, ob current_motor_thr
                                    ; erhöht (1) oder erniedrigt (0) 
wurde
.def    history_quick       = r24   ; von den letzten 8 Messungen 
abspeichern, ob current_motor_thr
                                    ; schnell erhöht/erniedrigt (1) oder 
nur normal erhöht/erniedrigt wurde (0)
.def    LED_loop            = r25
.def    LED0_on             = r26
.def    LED9_on             = r27
.def    ledblink_loopval_current    = r28 ; für tatsächliches 
Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
.def    ledblink_loopvalmax_current = r29 ; für tatsächliches 
Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)

; --------- Initialisierung ---------

    ; Stack initialisieren
    ldi   temp, 0xB5; RAMEND == 0xDF
    out   SPL, temp

    ; Watchdog einschalten
    ldi     temp, 0b00001111
    out     WDTCR, temp

    ; Rest
    ldi     LED0_on,0
    ldi     LED9_on,0
    ldi     LED_loop, LEDBLINK_LOOPVALMAX
    ldi     anatest_loop,1          ; gleich nach Start die erste 
Messung machen


    ldi     temp,0b11111100         ; initialise port B as I/O, 6 OUT  2 
IN
    out     DDRB,temp

    ldi     temp,0b00101111         ; key columns all low and
    out     PORTB,temp              ; active pull ups on rows enabled

    ldi     temp,0b01111111         ; initialise port D as I/O, 7 OUT
    out     DDRD,temp

    rcall   RESET_HIGH_TEMP_DIFF_PINS

    ; damit der Motor anläuft 5 Sek. einschalten
    ldi     temp,0b01111111         ; alle LEDs an PORT D
    out     PORTD,temp
    sbi     PORTB,2                 ; LED an Port B
    sbi     PORTB,3                 ; LED an Port B
    sbi     PORTB,4                 ; LED an Port B

    ldi     MotorThr,MotorThrMAX    ; volle Drehzahl
    rcall   STARTUPLOOP             ; 3 sec Motor komplett einschalten


    ; history mit "normal höher" oder "normal niedriger" füllen, damit 
auch gleich PRO_ADJUST anspringen kann, wenn es stark unterschiedlich 
ist.
    ldi     history_quick,0b00000000; clear history
    sbic    ACSR,ACO                ; skip next instruction if output is 
low
    rjmp    INIT_HOEHER
    ldi     history,0b00000000      ; clear history
    rjmp    MOTOR_SLOWDOWN

INIT_HOEHER:
    ldi     history,0b11111111      ; clear history

    ; Motor langsam von Maximalwert auf Default stellen
MOTOR_SLOWDOWN:
    subi    MotorThr,3              ; mit 3-facher Geschwindigkeit 
herunterregeln (ergibt etwa 2-3 Sek für's Herunterregeln)
    rcall   BARGRAPH
    rcall   MOTORLOOP
    cpi     MotorThr,MotorThrSTART  ; schon auf Defaultwert?
    brlo    MAINLOOP                ; dann nicht verringern
    rjmp    MOTOR_SLOWDOWN









MAINLOOP:

; --------- Spannung vergleichen ---------
    rcall   MOTORLOOP
    rcall   LEDBLINK

    ; nur von Zeit zu Zeit einen anatest machen
    dec     anatest_loop
    cpi     anatest_loop,0
    brne    MAINLOOP

    ldi     anatest_loop,anatest_every
    lsl     history                 ; Platz in History schaffen (Bit 0 
auf 0)
    lsl     history_quick           ; Platz in History schaffen (Bit 0 
auf 0)
    ldi     ledblink_loopval_current, LEDBLINK_LOOPVAL         ; 
Blinkwerte auf Standard
    ldi     ledblink_loopvalmax_current, LEDBLINK_LOOPVALMAX   ; 
Blinkwerte auf Standard

    sbic    ACSR,ACO                ; skip next instruction if output is 
low
    rjmp    HOEHER

    ; Ist-Temperatur stark höher      -> MotorThr um 5 erhöhen
    ; Ist-Temperatur normal höher     -> MotorThr um 1 erhöhen
    ; Ist-Temperatur stark niedriger  -> MotorThr um 2 verringern
    ; Ist-Temperatur normal niedriger -> MotorThr um 1 verringern

NIEDRIGER:
    ; Auswertung, ob "stark fallend"
    ; Wenn Temperatur fallend, dann hat Temp.fühler höheren Widerstand. 
Spannung an AIN2 ist dann höher.
    ; Jetzt also Spannung an AIN1 auch höher machen, um zu sehen, ob sie 
dann an AIN2 immer noch höher ist.
    ; Spannung an AIN1 wird erhöht, in dem Temp 0 auch EINgeschaltet 
wird.
    sbi     PORTB, 6
    rcall   MY_DELAY                ; ca 1 ms warten, damit die Spannung 
sich anpasst, falls Kapazitäten
    rcall   MY_DELAY
    rcall   MY_DELAY
    rcall   MY_DELAY
    rcall   MY_DELAY

    sbic    ACSR,ACO                ; skip next instruction if output is 
high
    rjmp    NIEDRIGER_NORMAL

NIEDRIGER_STARK:
    sbr     history_quick,1         ; setze Bit 0 auf 1 in history_quick
    ldi     ledblink_loopval_current, LEDBLINKQUICK_LOOPVAL         ; 
Blinkwerte auf schnell-blinkend
    ldi     ledblink_loopvalmax_current, LEDBLINKQUICK_LOOPVALMAX   ; 
Blinkwerte auf schnell-blinkend
    rcall   DEC_MOTORTHR
NIEDRIGER_NORMAL:
    rcall   DEC_MOTORTHR
    rjmp    HISTORY                 ; und springe dann zu HISTORY

HOEHER:
    sbr     history,1               ; setze Bit 0 auf 1 in history
    ; Auswertung, ob "stark steigend"
    ; Wenn Temperatur steigend, dann hat Temp.fühler niedrigeren 
Widerstand. Spannung an AIN2 ist dann niedriger.
    ; Jetzt also Spannung an AIN1 auch niedriger machen, um zu sehen, ob 
sie an AIN2 dann immer noch niedriger ist.
    ; Spannung an AIN1 wird erniedrigt, in dem Temp 1 auch AUSgeschaltet 
wird.
    cbi     PORTB, 7
    rcall   MY_DELAY                ; ca 1 ms warten, damit die Spannung 
sich anpasst, falls Kapazitäten
    rcall   MY_DELAY
    rcall   MY_DELAY
    rcall   MY_DELAY
    rcall   MY_DELAY

    sbis    ACSR,ACO                ; skip next instruction if output is 
low
    rjmp    HOEHER_NORMAL

HOEHER_STARK:
    sbr     history_quick,1         ; setze Bit 0 auf 1 in history_quick
    ldi     ledblink_loopval_current, LEDBLINKQUICK_LOOPVAL         ; 
Blinkwerte auf schnell-blinkend
    ldi     ledblink_loopvalmax_current, LEDBLINKQUICK_LOOPVALMAX   ; 
Blinkwerte auf schnell-blinkend
    rcall   INC_MOTORTHR
    rcall   INC_MOTORTHR
    rcall   INC_MOTORTHR
    rcall   INC_MOTORTHR
HOEHER_NORMAL:
    rcall   INC_MOTORTHR

; --------- History-Auswertung ---------

HISTORY:
    ; zunächst HighTempDiff-Pins wieder auf Normalzustand
    rcall   RESET_HIGH_TEMP_DIFF_PINS

    ldi     LED0_on,0               ; LED  0 Blinkmodus AUS (default)
    ldi     LED9_on,0               ; LED 10 Blinkmodus AUS (default)

    mov     temp,history
    andi    temp,0b01111111         ; letzte 7 Bits betrachten
    cpi     temp,0b01111111         ; wenn alle 6 Bits EIN
    breq    LEVEL_HOCH
    rjmp    LEVEL_WEITER

LEVEL_HOCH:
    ldi     LED9_on,1               ; LED 10 EIN
    rjmp    HISTORY_END

LEVEL_WEITER:
    mov     temp,history
    andi    temp,0b01111111         ; letzte 7 Bits betrachten
    cpi     temp,0b00000000         ; wenn alle 6 Bits AUS
    breq    LEVEL_RUNTER
    rjmp    HISTORY_END
LEVEL_RUNTER:
    ldi     LED0_on,1               ; LED 0 EIN

HISTORY_END:
    rcall   BARGRAPH
    rjmp    MAINLOOP

; ---------- ENDE -----------







; --------- Bargraph-Anzeige ---------

BARGRAPH:
    ; Anzahl LEDs = (MotorThr - MotorThrMIN) / 20
    ; dadurch max = (254 - 25) / 24 = 9,6
    ; dadurch min = (25 - 25) / 24 = 0
BARGRAPH_LEDCHECK0:
    ; Test, ob LED0 gerade blinkt (dann nichts ändern)
    cpi     LED0_on,0
    brne    BARGRAPH_LEDCHECK1
    ; normaler Check (wie bei anderen LEDs)
    cbi     PORTD,0
    cpi     MotorThr,LED0_on_if_higher
    brlo    BARGRAPH_LEDCHECK1
    sbi     PORTD,0
BARGRAPH_LEDCHECK1:
    cbi     PORTD,1
    cpi     MotorThr,LED1_on_if_higher
    brlo    BARGRAPH_LEDCHECK2
    sbi     PORTD,1
BARGRAPH_LEDCHECK2:
    cbi     PORTD,2
    cpi     MotorThr,LED2_on_if_higher
    brlo    BARGRAPH_LEDCHECK3
    sbi     PORTD,2
BARGRAPH_LEDCHECK3:
    cbi     PORTD,3
    cpi     MotorThr,LED3_on_if_higher
    brlo    BARGRAPH_LEDCHECK4
    sbi     PORTD,3
BARGRAPH_LEDCHECK4:
    cbi     PORTD,4
    cpi     MotorThr,LED4_on_if_higher
    brlo    BARGRAPH_LEDCHECK5
    sbi     PORTD,4
BARGRAPH_LEDCHECK5:
    cbi     PORTD,5
    cpi     MotorThr,LED5_on_if_higher
    brlo    BARGRAPH_LEDCHECK6
    sbi     PORTD,5
BARGRAPH_LEDCHECK6:
    cbi     PORTD,6
    cpi     MotorThr,LED6_on_if_higher
    brlo    BARGRAPH_LEDCHECK7
    sbi     PORTD,6
BARGRAPH_LEDCHECK7:
    cbi     PORTB,2
    cpi     MotorThr,LED7_on_if_higher
    brlo    BARGRAPH_LEDCHECK8
    sbi     PORTB,2
BARGRAPH_LEDCHECK8:
    cbi     PORTB,3
    cpi     MotorThr,LED8_on_if_higher
    brlo    BARGRAPH_LEDCHECK9
    sbi     PORTB,3
BARGRAPH_LEDCHECK9:
    ; Test, ob LED9 gerade blinkt (dann nichts ändern)
    cpi     LED9_on,0
    brne    BARGRAPH_LEDCHECK10
    ; normaler Check (wie bei anderen LEDs)
    cbi     PORTB,4
    cpi     MotorThr,LED9_on_if_higher
    brlo    BARGRAPH_LEDCHECK10
    sbi     PORTB,4
BARGRAPH_LEDCHECK10:
    ret



; MotorThr erhöhen
INC_MOTORTHR:
    cpi     MotorThr,MotorThrMAX    ; wenn schon Maximalwert
    breq    INC_MOTORTHR_RET        ; dann nicht erhöhen
    inc     MotorThr                ; sonst erhöhe Wert
INC_MOTORTHR_RET:
    ret

; MotorThr verringern
DEC_MOTORTHR:
    cpi     MotorThr,MotorThrMIN    ; wenn schon Minimalwert
    breq    DEC_MOTORTHR_RET        ; dann nicht verringern
    dec     MotorThr                ; sonst verkleinere Wert
DEC_MOTORTHR_RET:
    ret

; TempDiff-Pins auf Standard setzen
RESET_HIGH_TEMP_DIFF_PINS:
    cbi     PORTB, 6
    sbi     PORTB, 7
    ret



MOTORLOOP: ; Dauer ca. 90 ms
    ;von current_motor_thr bis 0 runterzählen
    mov     motorloopcounter,MotorThr
    sbi     PORTB,MOTOR             ; Motor ein
MOTORLOOP_EIN:
    rcall   MY_DELAY
    dec     motorloopcounter
    brne    MOTORLOOP_EIN

    cbi     PORTB,MOTOR             ; Motor aus

    ; von (255-current_motor_thr) bis 0 runterzählen und Motor aus
    ldi     motorloopcounter,255
    sub     motorloopcounter,MotorThr
MOTORLOOP_AUS:
    rcall   MY_DELAY
    dec     motorloopcounter
    brne    MOTORLOOP_AUS

    ret





LEDBLINK:
    ; Schleifenzähler immer modulo 256 zählen
    dec     LED_loop
    brne    LED0BLINK ; ist = 0?

    ; LED_loop zurücksetzen. Dabei high_temp_diff beachten.
    mov     LED_loop, ledblink_loopvalmax_current

LED0BLINK:
    cpi     LED0_on,0               ; Test, ob Blinken (LED 0 für 
"Temperatur runter") überhaupt erwünscht
    breq    LED9BLINK

    ; LED einschalten?
    cp      LED_loop, ledblink_loopval_current
    brlo    LED0_EIN

LED0_AUS:
    cbi     PORTD,0
    rjmp    LED9BLINK
LED0_EIN:
    sbi     PORTD,0

LED9BLINK:
    cpi     LED9_on,0               ; Test, ob Blinken (LED 9 für 
"Temperatur rauf") überhaupt erwünscht
    breq    LEDBLINK_ENDE

    ; LED einschalten?
    cp      LED_loop, ledblink_loopval_current
    brlo    LED9_EIN

LED9_AUS:
    cbi     PORTB,4
    rjmp    LEDBLINK_ENDE
LED9_EIN:
    sbi     PORTB,4

LEDBLINK_ENDE:
    ret





MY_DELAY: ; Dauer: 193,25 us
    wdr                             ; Watchdog zurücksetzen
    ldi     mydelay,255
MY_DELAY_LOOP:
    dec     mydelay
    brne    MY_DELAY_LOOP

    ret

STARTUPLOOP:
    ldi     startuploopcounter,STARTUPDELAY
STARTUPLOOP_INNER:
    rcall   MOTORLOOP
    dec     startuploopcounter
    brne    STARTUPLOOP_INNER

    ret

von spess53 (Gast)


Lesenswert?

Hi

>.def    LED0_on             = r26
>.def    LED9_on             = r27
>.def    ledblink_loopval_current    = r28 ; für tatsächliches
>Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
>.def    ledblink_loopvalmax_current = r29 ; für tatsächliches


Die Register r26..r31 sind in der 2313def.inc schon mit einem 'Namen' 
versehen worden: XL,XH,YL,YH,ZL,ZH. Daher die Warnungen.
Persönlich halte ich .def-Gedödel mit Registern, milde gesagt, für 
sinnfrei.
Mag bei kleinen Programmen noch gehen. Bei grösseren Programmen, wenn 
die Register für verschiedene Aufgaben benötigt werden führt das schnell 
zu Konfusion und bewirkt genau das Gegenteil.

MfG Spess

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Um das zu ürüfen, müsste man anhand der Zeilennummer in der Warnung die 
Zeilennummer in deinem Code suchen und entscheiden, ob die dortige 
Benutzung des Registers sich mit der übrigen Benutzung des gleichen 
Registers im Programm logisch beisst.

Leider geht das in der jetzigen Form nicht, denn du hast den Quellcode 
als normalen Text gepostet und die Forensoftware hat zusätzliche 
Zeilenumbrüche eingefügt. Dadurch führen die Zeilennummern in den 
Warnings zu nichtssagenden Stellen im Quellcode...

von Marcel L. (janno)


Angehängte Dateien:

Lesenswert?

Hab den Code noch mal angehängt.

von spess53 (Gast)


Lesenswert?

Hi

Nochmal: Die Register r26..r29 sind schon mit einer .def-Anweisung 
belegt!

MfG Spess

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Spess hat bereits den richtigen Hinweis geschrieben.

In deinem Programm sind die Warnungen vernachlässigbar, weil die 
Alternativnamen XL,XH,YL,YH,ZL,ZH nicht benutzt werden. Du musst 
allerdings aufpassen, wenn du das mal änderst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>Beim compilieren bekomme ich 4 Warnungen (siehe Bild).
Das Compilieren heisst hier übrigens Assemblieren...

>Kann ich die vernachlässigen?
Ja.
Die X,Y und Z Register werden nicht verwendet.

von Marcel L. (janno)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die superschnellen Antworten.
Das sollte ja dann auch auf den ATtiny2313 zutreffen, den ich einsetzen 
möchte? "tn2313def" antelle von "2313def.inc"
Das ganze soll mit einem 8Mhz Quarz laufen.
Sind die Fuse Bits o.k.?

von Holger K. (krulli) Benutzerseite


Lesenswert?

>Sind die Fuse Bits o.k.?
ja

>Das sollte ja dann auch auf den ATtiny2313 zutreffen, den ich einsetzen
>möchte? "tn2313def" antelle von "2313def.inc"

auch ja

von Uwe (Gast)


Lesenswert?

Hi!
>.def    LED0_on             = r26
>.def    LED9_on             = r27
>.def    ledblink_loopval_current    = r28 ; für tatsächliches
>Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
>.def    ledblink_loopvalmax_current = r29 ; für tatsächliches

schreibe mal:
.def    LED0_on             = XL
.def    LED9_on             = XH
.def    ledblink_loopval_current    = YL ; für tatsächliches
Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
.def    ledblink_loopvalmax_current = YH ; für tatsächliches

dann sollten die Meldungen weg sein. Gründe siehe oben.

Viel Erfolg, Uwe

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.