Stap 3: De code: de seriële communicatie.
Hoe gebeurt de communicatie met de schalen en de dataconversion?
De weegschaal die ik gebruik is een KERN PCB 6000-0. Het heeft een modus waar het voortdurend stuurt 18 byte datablocks met het gewicht via de seriële poort. De atmega8 buffers de 18 binnenkomende bytes. De laatste verzonden byte is altijd een Line Feed (ascii 10). Zodra de seriële ontvangt de Line Feed (ascii 10), een interrupt wordt geactiveerd en de code schakelt over naar de interrupt routine. Deze routine wordt gestart door de goedkeuring van de variabelen die nodig zijn voor de dataconversion. Het begint te lezen van de seriële buffer. Hoewel er 18 bytes in elke dataverkeer, slechts 9 tot 12 byte bevatten de werkelijke gewicht. Deze bytes worden opgeslagen voor conversie. Alle andere bytes zijn gedumpt in een tijdelijke variabele te spoelen van de buffer.
De opgeslagen bytes bevatten de 4 cijfers van het gewicht als ASCII-tekens. Dit betekent dat we ze converteren naar het juiste decimale waarden moeten voordat we alle berekeningen met hen kunnen doen. Gelukkig kan dit worden zeer gemakkelijk gedaan door substracting 48 van de binnenkomende waarden zoals elke ascii waarde 48 hoger dan de decimale waarde van dezelfde aard is.
De waarde van het eerste teken wordt vervolgens vermenigvuldigd met 1000, de tweede met 100 en de derde door 10. Deze drie resultaten worden vervolgens bij elkaar opgeteld en de vierde waarde is toegevoegd. Dit uiteindelijke resultaat is een integer die het gewicht wordt gemeten door de schalen.
Zodra dit gewicht is bekend, het wordt vergeleken met het gewenste gewicht in de hoofdlus en de LED's zijn ingesteld.