Bildschirmlupe an!
DDRx
, PORTx
, _Delay_ms()
--> R
steht fast immer für RegisterIn MC Studio
02_timer
lcd_lib_de.h
#include
! #inc
+ <Tab><lib.h>
vs "lib.h"
lcd_lib_de.h
F_CPU
18,432 MHz
--> Minimexle Frequenz18'432'000 Hz
?lcd_i
+ <tab> lcd_displayMessage("Hallo!", 0,0 )
--> Hinweis auf Zählanfang 0 nicht 1!Hallo! Zähler:
ä
nicht schreiben , sondern schreibt µ
, warum? ä
drin? In einer schon… In der anderen is µ
beim gleichen Bitmusterá
nutzen, oder ldc_putc(11100001);
--> was wurde vergessen? --> %
!PIN_EN
, PIN_RS
--> wo in Simulide? EN
? --> Enable. RS
--> Register SelectPORT_DATA
: von PORTC
nur die ersten 4 bits (0…3) 18,432 MHz
eingeben! PC0
auf D4
, PC1
auf D5
, PC2
auf D6
, PC3
auf D7
ä
an falscher Positionlcd_gotoxy
einfügenJetzt: aufsteigende Zahlen ausgeben Was tun?
uint8_t i=0;
und i++
in der Schleifesprintf
? (kann in String einen Zahlenwert ausgeben)sprintf(output_str, "i:%03u", i);
3
--> drei Dezimalstellen, u
--> unsignedoutput_str
deklarierenlcd_displayMessageoutput_str, 1,0);
#include <stdio.h>
vergessen aktuell zählt er nicht so schnell wie die CPU kann, sondern so schnell wie er es ausgeben kann. Die CPU kann aber schneller!
TCNTn
n
? in Mathe? --> Schaubild gilbt für alle 3 Zähler. Hier ist n=1, da TC1!OCRnA
--> Output Compare („Wert zum gegen-checken“)TCCRnA
--> für was steht TC? Timer Counter! Für was R? Register! --> hier neu: C für controlsprintf
und lcd_displayMessage
kopieren#lcd_displayMessageoutput_str, 1,**7**);
sprintf(output_str, "TC:%03u", TCNT1);
--> an zweiter Pos ausgeben. --> wichtig: 3
in 5
ändern!0
normal operation 000
= keine Clock. Da kommt nix raus!CS10
setzen --> schnellster ZählerCS10
? im Register TCCR1B
TCCR1B |= 1<<CS10;
vor der main loop_delay_ms()
if(TCNT1>x){doBlink();TCNT1=0;};
TCNTn
wird doch verglichen!OC1A (Int.req.)
OC1A
(OC1A (Int.req.) müsste OCF1A heißen für Flag --> siehe Text)OC1A
durchsuchen!11
z.B. delay für dauerhaftes Leuchten nach ein paar MillisekundenCOM1B1=1
und COM1B0=0
TCCR1A |= 1«COM1B0;
einfügenDDRB = 255;
WGM12
setzen, das ist aber in TCCR1B
!TCCR1B |= 1«WGM12;
OCR1AH = 0xFF;
, OCR1AL = 0xFF;
--> Ergebnisse:
Debugging Beispiel: DisplayAndTimer_v02 in ILIAS
kleine Änderungen:
str
initialisieren: char str[3]=„“;
Refactoring
» Rename
--> z.B. SwCounter
und OutputStr
char OutputStr[3]=„“;
char SwCounter;
(also keine Initialisierung!)Tipps
lcd_putstr
: TWDR=SwCounter;
lcd_putstr
: SPDR=SwCounter;
SwCounter
suchenMCU Monitor
PORTB|=1«PB3;
nach erstem lcd_putstr
PORTB&=~1«PB3;
nach zweitem lcd_putstr
Hyper-V-Schnellerstellung
Wdh:
TIMSK2 |= (1«TOIE1);
ISR()
--> suchen nach ISR (Goto implementation) liefert keine praktikable Antwort was das tut (Interrupt Service routine erklären)TIMER1_OVF_vect
!ISR(T
bietet schon TIMER1_OVF_vect
anISR(TIMER1_OVF_vect)
{
}
PORTB ^= (1 « PB3);
einfügenuint8_t IntFlag=0;
als globale VariableIntFlag=1;
in die Interrupt Routineif(IntFlag==1)
{
IntFlag=0;
}
TCCR1B |= 1«CS12;
besser TCCR1B |= 1«CS11;