C++ avr - Směr DDRB registru ve smyčce (znefunkční kod) – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

C++ avr - Směr DDRB registru ve smyčce (znefunkční kod) – Mikrokontroléry – Fórum – Programujte.comC++ avr - Směr DDRB registru ve smyčce (znefunkční kod) – Mikrokontroléry – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
BrainStupidityOverflow
~ Anonymní uživatel
2 příspěvky
9. 8. 2014   #1
-
0
-

Přeji dobrý den všem programátorům. Přicházím jsem s menší prosbičkou o pomoc někoho zkušeného s AVR platformou a její samotné programování v C++, nebo aspoň někoho kdo by byl schopen poradit.

Mam zapojení mikrokontroléru následující. Na pinu PB0 mam vodič který je připojen k externímu pull-up rezistoru (4,7 Ω), k němu mam připojený další vodiče a to jeden z arduina který pomocí jedné libky posílá puls který spíná zem, a zbývající vodič k osciloskopu. A teď zpět ke kódu, nyní mam průběh signálu oddělen že z jednoho pinu čtu (tedy PB0) a na základě přijatých dat z PB0 generuji výstupní signál na dalšim portu PB1, ale teď to chci zakombinovat na jeden jediný port, tedy PB0. Abych z něco vyčetl informaci a posléze přepl do write režimu a vygeneroval impuls na jednom pinu. Neni to přece nic složitého, ale zrovna jsem se zasekl nad tím problémem že pokud měnit směr DDRB registru z read režimu na write, nebo pouze na ten samý kod prostě přestane fungovat, a to konkrétně na boolu bFallin

#define F_CPU 1000000

#include <avr/io.h>
#include <util/delay.h>

#define INPIN PB0

bool bFalling = false;
bool bRising = false;

bool bReset = false;

#define DEBUG_MODE_GROUD 0

void debugWriteSignal(int Port, int Mode)
{
	if(Mode == DEBUG_MODE_GROUD)
	{
		PORTB &= ~_BV(1);
		_delay_us(10);
		PORTB |= _BV(1);
		_delay_us(10);
		PORTB &= ~_BV(1);
		_delay_us(10);
		PORTB |= _BV(1);
		}else{
		
	}
}

int main (void)
{
	DDRB  &= !_BV(INPIN);
	DDRB  |=  _BV(1);
	
	/* Button input */
	//DDRB  &= !_BV(PB2);
	//PORTB |= _BV(PB2);
	
	/* Init */
	bFalling = false;
	bReset = false;
	bRising = false;
	
	for (;;)
	{
		if(bReset == false)
		{
			//DDRB  &= !_BV(INPIN);  --- Znefunkční kod v podmince bFallin - Proč?!
			/* Fallin edge */
			if(bit_is_clear(PINB, INPIN))
			{
				if(bFalling == false)
				{
					//debugWriteSignal(1, DEBUG_MODE_GROUD);
				}
				bFalling = true;
			}else{
				if(bFalling)
				{
					//debugWriteSignal(1, DEBUG_MODE_GROUD);
					_delay_us(60);
					PORTB &= ~_BV(1);
					_delay_us(200);
					PORTB |= _BV(1);
				}
				bFalling = false;
				//bReset = true;
			}
		}
	}
}

Připojen obrázek.

Takto vypadá průběh signalu pokud vše pracuje jak má. (Tedy že se vyšle signal z channelu0).

Díki za pomoc a  rady.

Nahlásit jako SPAM
IP: 212.96.160.–
Reklama
Reklama
KIIV+42
God of flame
9. 8. 2014   #2
-
0
-

protoze delas spatnou operaci k tomu  &=    potrebujes bitovou negaci ~ ne jen normalni binarni negaci !  (! totiz udela z 1 -> 0  zatimco   ~1 => 0b11111110)

nicmene, ceho se tim stejne snazis dosahnout?

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
BrainStupidityOverflow
~ Anonymní uživatel
2 příspěvky
9. 8. 2014   #3
-
0
-

#2 KIIV
Díky moc za radu, tímhle jsem si uvědomil že se musim naučit v C++ logický operace, bitovou logiku atd. Protože nemá smysl tupě si pamatoval nějaká znamínka, a doufat že se vydaří to co potřebuji. Nemam teď možnost to vyzkoušet, takže odpovím později jak jsem dopadal s kodem. A jinak ještě otázka. Počáteční nastavení víceméně init DDRB registru (hned jeho první výskut v kodu) může být proveden tou bin-negací?

Čeho se snažim dosáhnout? Víceméně ničeho, jenom se naučit programovat v C++ s MCU, abych už konečně překonal ty nejasnosti v začátcích, a měl znalosti co se týče tohodle.Jinak ten signál nemá moc smyslnost.

Jinak moc díky za radu, určitě mě zase toto poposune o něco dál a budu schopen problémy řešit razantněji.

BTW: Jaký kodování používáš na klavesnici? Já jen že znaky tohoto typu "~" asi neudělám na český klávesnici.

Nahlásit jako SPAM
IP: 212.96.160.–
KIIV+42
God of flame
9. 8. 2014   #4
-
0
-

#3 BrainStupidityOverflow
ta prvotni inicializace je vesmes ve stylu:

DDRB = 0x00 & 0x00; // po restartu je DDRB = 0x00 a  !0x01 => 0x00

DDRB = 0x00 | 0x02;  // -> 0x02

takze to prirozene proslo..  protoze si potreboval hlavne tu 0x02, ale jak si znova nahodil tu "zmenu"

DDRB = 0x02 & 0x00; // -> 0x00

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pavelv0
Stálý člen
9. 8. 2014   #5
-
0
-

#3 BrainStupidityOverflow
Většinu znaků napíšeš na české klávesnici. Já jsem zastánce názoru, pokud člověk neumí na české klávesnici, ať nepřepíná ani na anglickou. Všelijaké znaky napíšeš přes pravé ALT, ptyldu ~ napíšeš ALT+1.

Nahlásit jako SPAM
IP: 212.79.110.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý