Skocz do zawartości

Sanwa 7000 PC & Android link


Pomocna odpowiedź

1 godzinę temu, _LM_ napisał:

Attiny13 w obudowie soic8 w trakcie przygotowań do wgrania wsadu na płycie docelowej 

Ach jak dobrze, że w nowych AVRach można wgrywać jednym drutem 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

No i jak zwykle się pośpieszyłem 🤬 

bad.thumb.JPG.bb2602182375b35f4e9037ccd93511aa.JPG

wyjście Q1 miało być na INT0 -> PB1, teraz w programie muszę użyć przerwania PCINT zamiast INT niech to szlag.....

To czego mi naprawdę brakuje w AVR to mapowania pinów, a przynajmniej wyjść/wejść peryferii sprzętowych tak jak STM kolego @pmochocki sorki za taką prywatę a czy mógłbyś spojrzeć na ten kod i podpowiedzieć co w rejestach przestawić abym mógł użyć PCINT zamiast INT bo mi się już odechciewa...

/*
 * main.c
 *
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/atomic.h>

#include "soft.h"


/*********** Makra ***********/

#define  SRX      PB1	//sanwa rx
#define  STX      PB2	//sanwa tx
//#define  URX      PB3	//uart rx
//#define  UTX      PB4	//uart tx

#define  SRX_LOW  (PINB & (1<<SRX))
//#define  URX_LOW  !(PINB & (1<<URX))
#define  STX_SET  PORTB|=   (1<<STX)
#define  STX_RST  PORTB&=  ~(1<<STX)

//#define  UTX_SET  PORTB|=   (1<<UTX)
//#define  UTX_RST  PORTB&=  ~(1<<UTX)
//#define  UTX_TOG  PORTB^=   (1<<UTX)
/*********** Koniec makr automatycznych ***********/
#define LOOKUPDATA 6
#define TIMERPROG 2
#define CLOCKDELAY 75
#define TPAUSE 6500

uint16_t timerInterval = 25; // default




const __flash char inTab[LOOKUPDATA]= {'a','b','c','d','e','f'};
const __flash uint16_t  out_tab[LOOKUPDATA] =  {30,100,300,600,1200,3000};


void getData(void);
volatile uint16_t timers[TIMERPROG];
volatile uint8_t intFlag;
volatile char c;

int main(void){
	//TCCR0A |=
	TCCR0A|= (1 << WGM01);			// tryb CTC
	OCR0A = (F_CPU / 1024UL) / 100UL;	// 100ms - 100Hz
	TCCR0B |= (1 << CS02) | (1 << CS00);	// preskaler = 1024
	TIMSK0 |= (1 << OCIE0A);			// przerwanie Compare Match

	MCUCR|= 1<<ISC01; // zbocze opadajace
	GIMSK|= 1<<INT0;  // zezw na przerwanie
	 DDRB|=(1<<STX);
	PORTB|=(1<<SRX);

	uartPortConf();

 //   PCMSK |= (1<<PCINT3); // maska zmiany pinow: przerwania przy nadlatujacym uart
 //   GIMSK |= (1<<PCIE); // wlacz przerwanie PCINT

    sei();
for(;;){

//if(c){
//
//
//
//	for(uint8_t i = 0; i < LOOKUPDATA; i++){
//		if(c == inTab[i]){// jesli ten znak wystepuje
//			ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
//				timerInterval = out_tab[i];
//				timers[0] = timerInterval;
//		}
//			uart_putc(c);
//			uart_putc('\n');
//
//			break;
//		}
//	}
//	c=0;
////	PCMSK|=(1<<PCINT3); // ena pcint
//}

if (intFlag) {
			TIMSK0 &=~(1<<OCIE0A); // pauza timera
			getData(); // wysylka danych online
			timers[0] = timerInterval; // tu brak atomic block poniewaz przerwania i tak zablokowane
			intFlag = 0;
			TIMSK0|=(1<<OCIE0A); // odblokowanie timera
		}


		if (!timers[0]) {

			STX_RST;
			_delay_ms(10); // sync
			STX_SET;
			timers[0] = timerInterval;
_delay_us(10);

GIFR|=(1<<INT0);// zerowanie zgloszonego przerwania
GIMSK|= (1<<INT0); // odblokowanie przerwanaia

		}
	}
}

uint8_t getByte(void)
{
	register uint8_t temp = 0;

	for (uint8_t i = 0; i < 8; i ++)
	{
		 STX_RST;//	IRLED_on;
		_delay_us(CLOCKDELAY + 25); // czasz na ustalenie sie stanu

	STX_SET;//	IRLED_off;

	if (SRX_LOW)temp |= (1 << i);

	_delay_us(CLOCKDELAY);

	}

	return temp;
}

void getData(void)
{
	//uint8_t data[20];

	char bf[3];

	for (uint8_t i = 0; i < 20; i ++){
		itoa (getByte(),bf,16); // wysylka hex online bez buforowania
		bf[2] = 0;
		uart_puts(bf);
		uart_puts(" ");
	}

	uart_putc('\n');
}

ISR(INT0_vect){ // zgloszenie z miernika
	GIMSK &=~(1<<INT0); // blokuj przerwanie
	intFlag = 1;
}


ISR(TIM0_COMPA_vect)//Przerwanie jest sekundnikiem oraz generuje opoxnienia systemowe
{
	uint16_t x;
	for (uint8_t i = 0; i < TIMERPROG; i++ ){
	x = timers[i];
	if (x) timers[i] = --x;
	}
}

//ISR(PCINT0_vect){
////	PCMSK &= ~(1<<PCINT3); // wyl przerwanie i mozna odczytac znak
//	c=uart_getc();
//	GIFR|= (1<<PCIF);//kasowanie przerwania
//}

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

46 minut temu, _LM_ napisał:

@pmochocki sorki za taką prywatę a czy mógłbyś spojrzeć na ten kod i podpowiedzieć co w rejestach przestawić abym mógł użyć PCINT zamiast INT bo mi się już odechciewa...

// init
GIMSK |= (1 << PCIE); // wlacz przerwanie PCINT
PCMSK |= (1 << PCINT2); // Ustawienie maski dla PCINT2
sei;

ISR(PCINT2_vect)
{
    // obsługa przetwanie
}

Nic więcej nie powinno być potrzebne.

EDIT:

Pin change interrupts - PCI will trigger if any enabled PCINT[5:0] pin toggles. 
Nie możesz sobie ustawić czy zbocze ma być opadające czy narastające - to nie będzie u Ciebie problemem?

Edytowano przez pmochocki
  • Pomogłeś! 1
Link do komentarza
Share on other sites

No właśnie, istotne jest aby to przerwanie było wyzwolone zboczem opadającym, niby pętla przez większość czasu i tak nie robi nic ciekawego i można by badać ten pin, jednak przerwanie upraszcza cały proces. Uhh ależ mnie to rozwaliło, a wszystko przez to że zmieniłem schemat bo chciałem dodać taktowanie mikrokontrolera z zewnętrznego generatora i dodać odbiór danych z uart. Najlepsze jest to, że jak rysowałem ten schemat to wiedziałem że trzeba te zmiany zaprowadzić a jednak taki babol, chyba już późno musiało być. No cóż to mnie tylko utwierdza w tym że prototypy warto budować w warunkach domowych. Dzięki za pomoc, później coś powalczę 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

19 minut temu, pmochocki napisał:

Nie możesz sobie ustawić czy zbocze ma być opadające czy narastające - to nie będzie u Ciebie problemem?

Nie, po prostu po przerwaniu zbadam stan pinu i będzie hulało. 

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Worklog powoli dobiega końca, poskładałem i uruchomiłem port multimetru. Pomimo że urządzenie w istocie jest proste. Nie obyło się bez błędów i poprawek, również wersja której teraz używam powinna być jeszcze raz przebudowana dotyczy to płytki IR portu jak i płytki konwertera uart i BT. Tak to wygląda:

IMG_20211127_165249.thumb.jpg.2584562e23ef6e33fe7fc0ef8662372a.jpgIMG_20211127_165337.thumb.jpg.091b7271d947b30c5252ac65c222d081.jpgIMG_20211127_165443.thumb.jpg.a9c58a1e6eb4868c26d91460565da76a.jpg

Mam problem z obudową gdyż jak narazie nie posiadam drukarki 3D a nie bardzo jest co dopasować, myślałem przez chwilę czy nie zalać całości w żywicy epoksydowej no ale wiadomo niema szans na jaki kolwiej serwis. Coś jednak trzeba będzie wykombinować. 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.