Zeit in Matrix darstellen Probleme

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo LotadaC!

Äääääähm LotadaC...... wo genau hast du diese Information gefunden?

Wird der UART nie genutzt (kein Print/Input), initialisiert Bascom den UART nicht, die Beine bleiben I/Os, die Direktive ist wirkungslos.


Diese Option habe ich nämlich persönlich noch nicht erlebt.



@Hydoxel:
Glückwunsch! :party:
Genauso soll es sein.....
Einfach anfangen, einiges ausprobieren, bei Problemen fragen und dann nachbessern bis es funktioniert!

Völlig egal wie zu Beginn der Code aussieht und ob er nun effektiv ist oder nicht.
Haptsache er funktioniert, du hast es selbst gemacht und etwas dabei gelernt! :)


Grüße,
Cassio
 

Rudi54

Neues Mitglied
20 Mai 2015
11
0
1
Sprachen
Hallo Hydoxel!

Von mir auch ein...
Willkommen im Forum!
Denn, hier wirst Du geholfen. Ohne die dumme Anmache "Ist bei dir das Google kaputt?"
Ich bin auch noch ein Frischling.

Zu Deinem Programm nur eine kleine Anregung.
Diese ganze If - Then Abfrage geht auch mit "Select Case". Spart Zeilen und wird übersichtlicher.

Select Case Minute
Case 0
PORTA = &B11111010
Case 1
......usw
Case 59
PORTD = &B01110111 : PORTC = &B11111000
End Select

Select Case Stunde
Case 0
Stunde = 12
.....usw
End Select

Gruß von der Insel
(Cassio hat mich ja schon "Insel Rudi" getauft)
Wünsche ALLEN
"Frohe Weihnachten und ein gesundes neues Jahr"
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,487
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Äääääähm LotadaC...... wo genau hast du diese Information gefunden?
Äääähhh... tja, da hab ich mich wohl zu weit aus dem Fenster gelehnt...

Laut Online-Hilfe soll die Direktive (also mit "$") lediglich den Wert den die Compiler-Settings vorgeben überschreiben
Instruct the compiler to override the baud rate setting from the options menu.
Daß nebenbei Transmitter und Reciever aktiviert werden, steht da nicht.
Die Compilersettings selbst aktivieren beides logischerweise auch nicht selbst.

Hab das jetzt natürlich mal alles reassembliert, hier also die Richtigstellung...
  • ein leeres Programm (leere Do-Loop) ohne Direktive setzt (wie zu erwarten) weder irgendwelche Werte in die Baudratenregister, noch werden Transmitter oder Reciever aktiviert. Somit bleiben die Beine I/Os.
  • verwendet man in diesem Programm irgendwo "Print" oder(!) "Input", werden die Baudratenregister gesetzt (->Compilersettings) und Transmitter und(!) Reciever aktiviert. (außerdem kommt natürlich noch der "Print" bzw "Input"-Kram dazu)
  • ein leeres Programm mit Direktive setzt die Baudratenregister und aktiviert Transmitter und(!) Reciever.
  • die Baud-Instruktion (ohne "$") manipuliert nur die Baudratenregister
Anmerkung: bei der Manipulation wird das U2X-Bit berücksichtigt, wenn nötig.
Aus

CodeBox BascomAVR
$regfile = "m16adef.dat"                                    'ATmega 32
$crystal = 8000000                                          'Quarz: 8 MHz
$baud = 9600
$hwstack = 32                                               'hardware stack
$swstack = 10                                               'software stack
$framesize = 40                                             'frame space
Do
Loop
wird folgender Assemblercode (bzw äquivalenter Maschinencode) generiert, ich habe den mal kommentiert:


CodeBox Assembler
; ******************************************Interruptvektoren********************************
00000000  JMP 0x0000002A        ;Jump
00000002  RETI         ;Interrupt return
00000003  NOP         ;No operation
00000004  RETI         ;Interrupt return
00000005  NOP         ;No operation
00000006  RETI         ;Interrupt return
00000007  NOP         ;No operation
00000008  RETI         ;Interrupt return
00000009  NOP         ;No operation
0000000A  RETI         ;Interrupt return
0000000B  NOP         ;No operation
0000000C  RETI         ;Interrupt return
0000000D  NOP         ;No operation
0000000E  RETI         ;Interrupt return
0000000F  NOP         ;No operation
00000010  RETI         ;Interrupt return
00000011  NOP         ;No operation
00000012  RETI         ;Interrupt return
00000013  NOP         ;No operation
00000014  RETI         ;Interrupt return
00000015  NOP         ;No operation
00000016  RETI         ;Interrupt return
00000017  NOP         ;No operation
00000018  RETI         ;Interrupt return
00000019  NOP         ;No operation
0000001A  RETI         ;Interrupt return
0000001B  NOP         ;No operation
0000001C  RETI         ;Interrupt return
0000001D  NOP         ;No operation
0000001E  RETI         ;Interrupt return
0000001F  NOP         ;No operation
00000020  RETI         ;Interrupt return
00000021  NOP         ;No operation
00000022  RETI         ;Interrupt return
00000023  NOP         ;No operation
00000024  RETI         ;Interrupt return
00000025  NOP         ;No operation
00000026  RETI         ;Interrupt return
00000027  NOP         ;No operation
00000028  RETI         ;Interrupt return
00000029  NOP         ;No operation
;*******************Reset-Einsprungspunkt****************************************
0000002A  LDI R24,0x5F        ;Load immediate
0000002B  OUT 0x3D,R24        ;Out to I/O location ***Stackpointer setzen (SPL)
0000002C  LDI R28,0x40        ;Load immediate      ***R28=0x40
0000002D  LDI R30,0x26        ;Load immediate      ***R30=0x26
0000002E  MOV R4,R30        ;Copy register       ***R4=0x26   
0000002F  LDI R24,0x04        ;Load immediate
00000030  OUT 0x3E,R24        ;Out to I/O location ***Stackpointer setzen (SPH) -> RAMEND
00000031  LDI R29,0x04        ;Load immediate      ***R29=0x04
00000032  LDI R31,0x04        ;Load immediate      ***R31=0x04
00000033  MOV R5,R31        ;Copy register       ***R5=0x04
00000034  WD<R                 ;Watchdog reset
00000035  IN R24,0x34        ;In from I/O location **R24=MCUCSR
00000036  MOV R0,R24        ;Copy register          ***R0=MCUCSR
00000037  ANDI R24,0xF7        ;Logical AND with immediate
00000038  OUT 0x34,R24        ;Out to I/O location ***alle Reset-Flags ausser Watchdog löschen
00000039  LDI R24,0x18        ;Load immediate      ***R24=0x18
0000003A  CLR R25            ;Clear Register      ***R25=0
0000003B  OUT 0x21,R24        ;Out to I/O location ***unlock WatchdogEnableBit
0000003C  OUT 0x21,R25        ;Out to I/O location ***Watchdog abschalten
0000003D  LDI R30,0xFE        ;Load immediate
0000003E  LDI R31,0x03        ;Load immediate         ***Z-Pointer -> 0x03FE
0000003F  LDI R26,0x60        ;Load immediate
00000040  LDI R27,0x00        ;Load immediate      ***X-Pointer -> 0x0060 (SRAMstart)
00000041  CLR R24            ;Clear Register      ***R24=0
;*********Schleife mit dekrementierendem Z-Pointer als Schleifenzähler schreibt 0x00 an das Ziel des Z-Pointers, mit post-inkrement***
00000042  ST X+,R24            ;Store indirect and postincrement
00000043  SBIW R30,0x01        ;Subtract immediate from word
00000044  BRNE PC-0x02        ;Branch if not equal
;*********effektiv wird damit der gesamte SRAM (nach dem I/O-Space) gelöscht***
00000045  LDI R24,0x33        ;Load immediate
00000046  OUT 0x09,R24        ;Out to I/O location ***UBRRL=0x33
00000047  LDI R24,0x00        ;Load immediate
00000048  OUT 0x20,R24        ;Out to I/O location ***UBRRH=0x00
00000049  LDI R24,0x18        ;Load immediate
0000004A  OUT 0x0A,R24        ;Out to I/O location ***setzt TXEN und RXEN in UCSRB <-------------- Transmitter und Reciever aktiviert
0000004B  CLR R6            ;Clear Register      *** R6=0
;******************Endlosschleife (leeres Hauptprogramm)******
0000004C  JMP 0x0000004C    ;Jump
;**************************Ende*******************************
;*********ZeitvernichtungsRoutine*****************************
0000004E  SBIW R30,0x01        ;Subtract immediate from word
0000004F  BRNE PC-0x01        ;Branch if not equal
00000050  RET                 ;Subroutine return
;*************************************************************
;****************Routine setzt R6.2 über das "T" *************
00000051  SET                 ;Set T in SREG
00000052  BLD R6,2            ;Bit load from T to register
00000053  RET                 ;Subroutine return
;*************************************************************
;****************Routine löscht R6.2 über das "T" ************
00000054  CLT         Clear T in SREG
00000055  BLD R6,2        Bit load from T to register
00000056  RET         Subroutine return
;*************************************************************

Ohne Baudratendirektive entfallen dann die Zeilen (Adressen) 0x0045..0x004A
Verwendet man den UART aus den Compilersettings heraus, stehen diese Zeilen erst hinter dem "CLR R6" (also vertauscht).
 
Zuletzt bearbeitet:

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)