Prosty program, trudne zadanie

0

Witam. Jestem nowy i zaczynam z językiem C. Posiadam kontroler i spory zasób wiedzy na temat elektroniki, ale nie programowania. Proszę was o pomoc jak napisać program który po podaniu na wejście stanu wysokiego, na wyjście poda stan wysoki i po X czasie wyłączy stan wysoki, pomimo stanu wysokiego na wejściu? Pozdrawiam

0

Musisz ogarnać dokumentację sprzętu elektronicznego, który używasz. Gdzieś tam powinny być opisane różne funkcje logiczne, które będą Ci potrzebne do twojego programu.
Generalnie nie podałeś żadnych danych więc raczej trudno będzie Ci pomóc.

0

Jest to najprostsze arduino. Jakich danych potrzeba?

1

Zależy w czym piszesz. Arduino IDE czy zwykłe C.
Tak z głowy pisane (nie testowane), to to by wyglądało mniej więcej tak.
Aczkolwiek to tylko tak z głowy, od razu mówie, w praktyce pewnie napotkasz problemy typu drgania styków, jeśli to jakiś button stykowy (ale to da sie programowo wyeliminować).
Odsyłam do dokumentacji Arduino IDE
Tutaj

// Arduino IDE
#define PIN 9
#define DELAY_IN_MS 3000
int val = 0;
void setup()
{

	pinMode(PIN, INPUT);
}
void loop()
{
	val = digitalRead(PIN);
	if(val == HIGH)
	{
		delay(DELAY_IN_MS);
		pinMode(PIN, OUTPUT);
		digitalWrite(PIN, HIGH);
	}
}

// C
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU <cz.kwarca>
#define PIN PD2
#define PINDEF PIND
int main(void)
{
	// portb = out
	DDRB = 0xFF;
	DDRD &= ~(1 << PIN);
	while(1)
	{
               // Input high
		if(PINDEF & (1 << PIN)){
			PORTB |= (1 << PB2);
                        _delay_ms(3000);
                        PORTB &= ~(1 << PB2);
               }
		else
			PORTB &= ~(1 << PB2);
	}
}
0

Bardzo dziękuje za zainteresowanie lecz mam problem z konfiguracją tego programu i identyfikacją pinów. Mogę liczyć na pomoc?

0

To tylko przykład. Spójrz do manuala, tam masz wszystko na temat pinów napisane.
Z której wersji korzystasz, C czy Ardu IDE?
Jeśli jesteś zielony jak trawa to nie baw sie z C tylko użyj ide.

0

Korzystam z IDE i dużo da się w tym na logikę wziąć dlatego pod tym kątem szukam pomocy.

1

@Proxima dobre rozwiązanie, ale nie do końca zgodne z założeniami autora:

// Arduino IDE
#define PIN 9
#define DELAY_IN_MS 3000

void setup()
{
    pinMode(PIN, INPUT);
}
void loop()
{
    if(digitalRead(PIN))
    {
/*Proxima:  w tym fragmencie, procesor najpierw odczeka założony czas, potem zaświeci diodę*/
        /*delay(DELAY_IN_MS);
        pinMode(PIN, OUTPUT);
        digitalWrite(PIN, HIGH);*/
/*Rozwiązanie:*/
        pinMode(PIN, Output);
        digitalWrite(PIN, High);
        delay(DELAY_IN_MS);
        /*Plus ustawienie pinu znów jako wejścia!*/
        digitalWrite(PIN, Low);
        pinMode(PIN, Input);
  }
}

Przy czym taktowanie procesora lepiej definiować w opcjach projektu, robienie tego dyrektywą może trochę namieszać.

Autorze tematu, co znaczy "problem z konfiguracją programu"? Jeśli masz problem z identyfikacją pinów (a piszesz w IDE) to spójrz na to tak:
Na początku programu masz zdefiniowany PIN jako liczbę 9, to oznacza (na chłopski rozum), że tam gdzie na płytce masz napisaną liczbę 9, tam masz swój PIN, na który podajesz, lub otrzymujesz stan wysoki. Dodatkowo, kolega @Proxima zrobił to tak, że podanie stanu wysokiego na jeden pin daje stan wysoki na TYM SAMYM pinie, (w rozwiązaniu w C jest odwrotnie) zastanów się którą opcję wolisz i pamiętaj o tym.
Pozdrawiam :)

0

Może wyjaśnię to w inny sposób. Zależy mi na takim programie który po podaniu na np. PIN 9 stanu wysokiego to na pinie 13 też poda stan wysoki i po 200ms go wyłączy pomimo stanu wysokiego na pinie 9.

0

No ale to przecież masz przykład mój i @Bartosz36, z czym masz problem w tych kodach?

Jak nie umiesz ich przerobić to mów z czym konkretnie masz problem. Bo wiemy że masz problem, ale uparcie od samego rana nie chcesz powiedzieć, z czym dokładnie masz problem : D

Jak chcesz gotowca, to troche lipa, bo akurat embedded to na tyle ciekawa sprawa że nawet chyba nie warto prosić o gotowce ; ]

Natomiast jeśli nie rozumiesz z kodu nic a nic, wróć do manuala, przecież to bagatela wywołanie kilku funkcji.

Protip, to co chcesz zrobić to kwestia dopisania jednej funkcji do programu @Bartosz36. No padawan, los jest w twoich rękach.

Protip-Niemalże-Spoiler, ta druga funkcja to delay.
Protip3. W której linii nie powiem, pomyśl sam.

0

To i ja dodam Protip'a: Zwróć uwagę na linijki:

#define PIN 9
digitalWrite(PIN, High); 

Pobaw się tym co się w nich znajduje, pokombinuj. Arduino właśnie od tego jest ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1