Montuje zegar binarny, gdzie piny od 2-6 reprezentują godzine binarnie a piny 7-12 minuty, a pin 13 tylko sekundnik. I mam problem z kodem - nie wiem co zrobić aby dobrze wyświetlał czas?
portb nie jest w całości używany w atmegach (masz tam nawet napisane) musiałbyś sobie zmienić fusebity, ale wtedy musiałbyś mieć programator do zmiany softu w tym procesorze.
Potrzebujesz 6bitów do minut i 5bitów do godzin + sekundnik. Więc weź sobie portd jako minuty + sekundy, a portb jako godziny.
Jeśli zrobiłbyś to zgodnie z tym co napisałem, to możesz zrobić tak:
PINB=hours;//ustawisz 5ostatnich pinów portub jako stan godziny więc to z nich powinieneś korzystać
PIND=(minutes1)|sekundy;//(przesuwasz minuty 1bit w lewo, a na ostatni bit dodajesz sekundy), używasz wtedy ostatnich 7bitów portud, możesz przesunąć całość o 2bity i wtedy będziesz używał pierwszych pinów (ostatni pin będzie wolny)
A co do pytania w tytule, to kompilator zmieni liczbę dziesiętną na binarną. Więc jeśli nie wpisujesz niczego z zewnątrz to nie musisz nic konwertować.
Jeśli używasz starszych pinów musisz przesunąć wartość bardziej w ich kierunku, jednak zgodnie z linkiem który podałeś nie powinieneś używać dwóch najstarszych pinów portub (a ty używasz jednego z nich). Używanie funkcji dla jednej instrukcji mija się z celem.
void setup()
{
DDRD=0xFF;//portd jako wyjście
DDRB=0xFF;//portb jako wyjście
}
char hours = 19;
char minutes = 44;
bool clock = false;
void loop()
{
if(hours == 24)
{
hours = 0;
}
if (minutes == 59)
{
minutes = 0;
hours++;
} else {
minutes++;
clock=~clock;//zmiana stanu clock co sekundę
}
delay(1000);//zajęcie procesora poza warunkiem (bo ci będzie przeskakiwał o sekundę co 24h i co godzinę)
//weź poprawkę że delay działa względem ustawionej w kompilatorze częstotliwości pracy procesora
PORTB=(hours<<2);
PORTD=(minutes<<1)||sekundy;
}
piny 9:13 to godzina, a piny 1:6minuty, a 7pin to sekundnik. Pisane z palca, ale powinno działać.
Weź też pod uwagę, że użycie delay spowoduje że nie zrobisz z procesorem nic innego. Powinieneś zacząć korzystać z przerwań.
stan wyjsc dla godziny sie zgadza 9 = 01001, ale minuty nie koniecznie bo przeskaują po miedzy stanami: 100000 a 001101 suma obydwóch to 45 sie zgadza, ale nie da się w jednym cyklu?
a dla 10.00 juz sie nie zgadza bo 00101 a minuty 100000
ta migająca dioda jest najmłodszym pinem z minut więc ten if na końcu jest zbędny. Wartości zmiennych powinieneś przypisywać w setup. A jeśli przeniesienie tego do tej funkcji nie zadziała to powinieneś wywalić to volatile, widać kompilator do arduino nie wie co to.
sketch_dec13a.ino: In function ‘void loop()’:
sketch_dec13a.ino:15:5: error: ‘seconds’ was not declared in this scope
sketch_dec13a.ino:18:3: error: ‘minutes’ was not declared in this scope
sketch_dec13a.ino:23:6: error: ‘minutes’ was not declared in this scope
sketch_dec13a.ino:26:3: error: ‘hours’ was not declared in this scope
sketch_dec13a.ino:28:5: error: ‘hours’ was not declared in this scope
sketch_dec13a.ino:32:2: error: ‘TMPB’ was not declared in this scope
sketch_dec13a.ino:32:10: error: ‘hours’ was not declared in this scope
sketch_dec13a.ino:34:5: error: ‘TMPD’ was not declared in this scope
sketch_dec13a.ino:34:13: error: ‘minutes’ was not declared in this scope
sketch_dec13a.ino:34:26: error: ‘seconds’ was not declared in this scope
sketch_dec13a.ino:36:6: error: ‘clock’ was not declared in this scope