Vstupná jednotka s palcovým prepínačom TS211: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 17: | Riadok 17: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
Základným komponentom tohto riešenia je dvojsekčný palcový prepínač TS211. Každá sekcia prepínača funguje ako mechanický dekodér, ktorý prevádza nastavenú číslicu (0–9) na 4-bitový signál v kóde BCD (Binary Coded Decimal). Prepínač má pre každú sekciu 5 výstupov: jeden spoločný kontakt (Common) a štyri dátové kontakty s váhami 1, 2, 4 a 8. | |||
Hardvérové zapojenie: | |||
Prepojenie s mikrokontrolérom ATmega328P na doske ACROB bolo realizované nasledovne: | |||
Ľavý blok (Desiatky): Výstupy s váhami 1, 2, 4, 8 sú pripojené na piny A0, A1, A2 a A3 (čo zodpovedá portu PORTC, bity 0–3). | |||
Pravý blok (Jednotky): Výstupy sú pripojené na digitálne piny D2, D3, D4 a D5 (port PORTD, bity 2–5). | |||
Spoločné kontakty (C): Obe sekcie majú spoločný kontakt pripojený na GND (zem). | |||
Z hľadiska mechanickej konštrukcie bolo kvôli nedostatočnej dĺžke kontaktov prepínača pre montáž priamo do breadboardu zvolené pripojenie pomocou flexibilných vodičov, čím sa zabezpečil spoľahlivý elektrický kontakt. | |||
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]] | [[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]] | ||
Princíp činnosti a softvérové spracovanie: | |||
Vstupy mikrokontroléra sú nakonfigurované v režime s aktivovanými internými pull-up rezistormi. To znamená, že piny pracujú v negatívnej logike: | |||
Ak je kontakt v prepínači otvorený, pull-up rezistor drží na pine logickú 1. | |||
Ak je kontakt zopnutý (číslica je zvolená), pin sa prepojí so zemou (GND) a procesor načíta logickú 0. | |||
V programe sa preto načítané hodnoty z registrov PINC a PIND najskôr bitovo invertujú (~). | |||
Pre desiatky (PORTC) sa priamo maskujú spodné 4 bity. | |||
Pre jednotky (PORTD) sa využíva bitový posun doprava o 2 miesta (>> 2), aby sa bity z pozícií D2–D5 dostali na pozície 0–3 pre správny výpočet váhy BCD kódu. | |||
[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]] | [[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]] | ||
| Riadok 35: | Riadok 47: | ||
<tabs> | <tabs> | ||
<tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;"> | ||
#define F_CPU 16000000UL | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <util/delay.h> | |||
#include <stdio.h> | |||
#include "uart.h" | |||
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | |||
uint8_t read_bcd_tens(void) { | |||
uint8_t status = ~PINC; | |||
return (status & 0x0F); | |||
} | |||
uint8_t read_bcd_units(void) { | |||
uint8_t status = ~PIND; | |||
return ((status >> 2) & 0x0F); | |||
} | |||
int main(void) | int main(void) | ||
{ | { | ||
uart_init(); | |||
stdout = &mystdout; | |||
DDRC &= ~0x0F; PORTC |= 0x0F; | |||
DDRD &= ~0x3C; PORTD |= 0x3C; | |||
uint8_t last_val = 255; | |||
return | while(1) | ||
{ | |||
uint8_t tens = read_bcd_tens(); | |||
uint8_t units = read_bcd_units(); | |||
uint16_t total = (tens * 10) + units; | |||
if (total != last_val) { | |||
printf("Value: %02u\n", total); | |||
last_val = total; | |||
} | |||
_delay_ms(150); | |||
} | |||
return 0; | |||
} | } | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
| Riadok 72: | Riadok 116: | ||
'''Video:''' | '''Video:''' | ||
<center><youtube>D0UnqGm_miA</youtube></center> | <center><youtube>D0UnqGm_miA</youtube></center> | ||
== Čo by som urobil inak == | == Čo by som urobil inak == | ||
Verzia z 16:45, 19. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Sofiia Nevzorova
Zadanie
Navrhnite a realizujte vstupnú jednotku na báze dvojsekčného palcového prepínača TS211 s BCD kódovaním pripojenú k vývojovej doske ACROB. Programovo zabezpečte čítanie hodnôt z oboch sekcií prepínača (desiatky a jednotky) v negatívnej logike s využitím interných pull-up rezistorov mikrokontroléra ATmega328P. Implementujte algoritmus na prevod BCD kódov z portov PORTC a PORTD na výsledné dekadické číslo v rozsahu 00 až 99. Zabezpečte výpis aktuálnej hodnoty cez rozhranie UART do konzoly pri každej zmene nastavenia(na overenie).

Literatúra:
Analýza a opis riešenia
Základným komponentom tohto riešenia je dvojsekčný palcový prepínač TS211. Každá sekcia prepínača funguje ako mechanický dekodér, ktorý prevádza nastavenú číslicu (0–9) na 4-bitový signál v kóde BCD (Binary Coded Decimal). Prepínač má pre každú sekciu 5 výstupov: jeden spoločný kontakt (Common) a štyri dátové kontakty s váhami 1, 2, 4 a 8.
Hardvérové zapojenie: Prepojenie s mikrokontrolérom ATmega328P na doske ACROB bolo realizované nasledovne: Ľavý blok (Desiatky): Výstupy s váhami 1, 2, 4, 8 sú pripojené na piny A0, A1, A2 a A3 (čo zodpovedá portu PORTC, bity 0–3). Pravý blok (Jednotky): Výstupy sú pripojené na digitálne piny D2, D3, D4 a D5 (port PORTD, bity 2–5). Spoločné kontakty (C): Obe sekcie majú spoločný kontakt pripojený na GND (zem). Z hľadiska mechanickej konštrukcie bolo kvôli nedostatočnej dĺžke kontaktov prepínača pre montáž priamo do breadboardu zvolené pripojenie pomocou flexibilných vodičov, čím sa zabezpečil spoľahlivý elektrický kontakt.

Princíp činnosti a softvérové spracovanie: Vstupy mikrokontroléra sú nakonfigurované v režime s aktivovanými internými pull-up rezistormi. To znamená, že piny pracujú v negatívnej logike: Ak je kontakt v prepínači otvorený, pull-up rezistor drží na pine logickú 1. Ak je kontakt zopnutý (číslica je zvolená), pin sa prepojí so zemou (GND) a procesor načíta logickú 0. V programe sa preto načítané hodnoty z registrov PINC a PIND najskôr bitovo invertujú (~). Pre desiatky (PORTC) sa priamo maskujú spodné 4 bity. Pre jednotky (PORTD) sa využíva bitový posun doprava o 2 miesta (>> 2), aby sa bity z pozícií D2–D5 dostali na pozície 0–3 pre správny výpočet váhy BCD kódu.

Algoritmus a program
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
uint8_t read_bcd_tens(void) {
uint8_t status = ~PINC;
return (status & 0x0F);
}
uint8_t read_bcd_units(void) {
uint8_t status = ~PIND;
return ((status >> 2) & 0x0F);
}
int main(void)
{
uart_init();
stdout = &mystdout;
DDRC &= ~0x0F; PORTC |= 0x0F;
DDRD &= ~0x3C; PORTD |= 0x3C;
uint8_t last_val = 255;
while(1)
{
uint8_t tens = read_bcd_tens();
uint8_t units = read_bcd_units();
uint16_t total = (tens * 10) + units;
if (total != last_val) {
printf("Value: %02u\n", total);
last_val = total;
}
_delay_ms(150);
}
return 0;
}
#include <avr/io.h>
void adc_init(void); // A/D converter initialization
unsigned int adc_read(char a_pin);
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Video:
Čo by som urobil inak
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.