Te deklaracje umieść w pliku irq.h [syntax=c]struct status { uint32_t adc:1; uint32_t rtc:1; }; extern volatile struct status sts;[/syntax] i plik ten dołącz do main.c i irq.c w irq.c lub main.c umieść ta definicję [syntax=c]volatile struct status sts={0,0};[/syntax]
Wszystkie "wewnętrzne" wystarczą - reszta jest zbędna. 4\/3!!
Do funkcji przekazuje zmienną typu volatile za pomocą referencji. Ja tam widzę zwykły wskaźnik a nie referencję. Funkcji nieodpowiada to że to co dostaje jest typu volatile. A na czym to "nieodpowiadanie" polega? Próbowałem to zwalczyć rzutując argument ale nic to nie daje. To znaczy czego nie daje? Czy ktoś wie jak rozwiązać ten problem? Ale jaki...
Może bitfield: volatile typedef struct{ u8 PB0:1; u8 PB1:1; u8 :6; }Bits; u8 zmienna = 0; Bits *STICK =(volatile Bits*) &zmienna; STICK->PB0 = 1;
I jeszcze jedna propozycja wykorzystania pól bitowych w przykładzie Electixa bez konieczności definiowania całych struktur bitowych: [syntax=c] #define bit_Field(var, bit, len) ((*(volatile struct{uint32_t:(bit)%32;uint32_t fld:len;}*)\ ((uint32_t*)&(var)+(bit)/32)).fld) // var - nazwa zmiennej // bit - numer pierwszego bitu pola bitowego // len - długość...
Rozwiązanie z postu powyżej jest najlepszym według mnie: if(v) PORTB |= (1<<PB3); else PORTB &=~(1<<PB3); Żeby jednak traktować pojedynczy bit portu jako osobną zmienną można wykorzystać fakt, że rejestry io posiadają swój adres w przestrzeni danych, przez co można uzyskać adres i rzutować wskaźnik na jakąś bardziej...
No i masz powielone definicje struktur. Zrób to tak: 1. W nagłówku zdefiniuj samą strukturę: struct cośtam { ... }; 2. Potem w pliku .c do którego dołączasz ten nagłówek zdefiniuj zmienną tego typu: volatile struct cośtam jakaśtam; 3. W nagłówku wyexportuj tą zmienną: extern volatile struct cośtam jakaśtam; Powinno działać. 4\/3!!
Przecież przy deklaracji w pierwszym kodzie jak byk stoi volatile :) [syntax=cpp]volatile struct godzina TimeOn, TimeOff;[/syntax]
AVE... Do wszystkich funkcji podajesz nazwę bitu w rejestrze portu i nazwę bitu w rejestrze kierunku. Przykładowo dla PICa te rejestry to PORTx i TRISx, gdzie x to nazwa portu (A, B, C, etc.). Zatem przykładowo kod dla PIC16F do sprawdzenia obecności dwóch sensorów na dwóch pierwszych pinach portu A i ustawienie stosownych flag w dedykowanej ku temu...
[syntax=c]#define COUNTERMAX (uint32_t)(.5*1000) volatile struct { uint8_t cnt:4; }binary_counter; volatile uint32_t counter; void SysTick_Handler (void) { counter++; if(counter >= COUNTERMAX) { counter = 0; binary_counter.cnt++; } }[/syntax]
Nie wiem jak v3.4.1 ale w v3.4.3 efekt jes taki: struct biciki{ unsigned bicik1:1; unsigned bicik2:2; unsigned bicik3:1; }; struct biciki pole; ... int main(void) { pole.bicik1=1; pole.bicik2=3; pole.bicik3=1; ... //po kompilacji dla "struct biciki pole" ... 27:m128.c **** pole.bicik1=1; 148 .LM8:...
Czy ktoś wie co tu się dzieje co to za can_block_p? i co ten fragment robi. Ogólnie wiem że volatile powoduje ze to nie będzie optymizowane.. [syntax=c] volatile struct st_can __evenaccess * can_block_p; can_block_p = (struct st_can __evenaccess *) 0x90200;[/syntax]
W życiu bym nie wpadł na to że kompilator zoptymalizuje program, tak że nie będzie działać. Raczej szukałem problemu w moim kodzie i logice działania. W planie procesor ma obsługiwać wyświetlacz, przerwania zewnętrzne (pomiar prędkości maszyny) oraz sterowanie PWM i przekaźnikami. Wracając do tematu powinienem zadeklarować całą strukturę jako volatile...
Może są inne błędy, ale: [syntax=c]volatile struct tm* t = 0;[/syntax] raczej nie wróży nic dobrego. t będzie wskazywało na komórkę pamięci o adresie 0 - rejestr R0 mikrokontrolera. Jeśli używasz wskaźników to musisz sobie przydzielić pamięć na strukturę na którą wskazują.
struct portb { unsigned DS:1; unsigned RW:1; unsigned AS:1; unsigned :2; unsigned LOAD:1; unsigned :1; unsigned CS:1; }; volatile struct portb* const Portb = (volatile struct portb*)&PORTB; Bez const kompilator nie ma pewności, że Portb będzie zawsze pokazywać na adres i/o i operacje bitowe będą dostępne....
DDRB, PORTB i inne są rejestrami, ale co znaczące można uzyskać ich adres. Utwórz sobie strukturę, w której będziesz przechowywał wskaźniki na rejestry oraz jakąś maskę bitu nad którym chcesz operować. [syntax=C]#include <avr/io.h> #include <macro.h> #include <stdint.h> struct ow_pin { volatile uint8_t* pin; volatile uint8_t* port;...
"Przydomek volatile wyłącza stosowaną przez kompilator optymalizację w stosunku do zmiennej. Używa się go wtedy, gdy dana zmienna jest modyfikowana przez nieznaną kompilatorowi formę (np. funkcję przerwania, itp.)." Zawsze to ustawiam aby nie pozwolić GCC na bycie 'za mądrym'. Przykład - mój kod w poście: volatile struct Work state; volatile struct...
Hard Fault może oznaczać włączenie przerwania do którego nie napisano obsługi. Mylisz się. Standardowa rozbiegówka definiuje "słabe" handlery przerwań zawierające puste nieskonczone pętle. To nie ma nic wspolnego z hardfault'em. Hardfault leci generalnie na 1) dostęp do nieistniejącej pamięci, 2) nierozpoznaną instrukcję rdzenia, 3) nad użycie magistral...
#define int i32 typedef i32 (*TCpintd_InitFunction)(stru... Cpintd_Driver* instance); struct Cpintd_Driver { struct Cpintd_Device* instance; TCpintd_InitFunction init; }; struct Cpintd_Device { volatile struct Hardware* hardware; struct CSL_CpIntdCfgInfo configuration; }; Ktoś pomógłby mi zaalokować pamięć dla wskaźnika...
Nie ma to jak wrzucać dokładny kod błędu... main.c:32:32: error: Roleta_EEPROM causes a section type conflict with Roleta_EEPROM2 volatile struct Roleta_offsets Roleta_EEPROM[7] __attribute__ ((section(".eeprom_mem&... __attribute__ ((aligned (32))) = ^ Jak chcesz to mieć...
le nie ma tam słowa o FMC . No bo FMC po skonfigurowaniu to po prostu pamięć w przestrzeni adresowej - czyli po prostu piszesz lub czytasz do/z tego adresu. Czyli DMA memory to memory. Dla przykładu u mnie w projekcie teraz używam banku 1, 16 linii danych i szyny adresowej A2 jaki DC. Po sonfigurowaniu FMC [syntax=c]typedef struct { volatile uint16_t...
Proponuję tego tak nie robić tylko utworzyć sobie do tego celu sekcję (at).:KoSik:. Po pierwsze [syntax=c]struct NOINIT nvram __attribute__((at(0x20000000)));[/syntax... jest tylko dla Keila - czyli niezbyt często wykorzystywanego przez amatorów kompilatora. Dla gcc trzeba zrobić sobie sekcję i nie ma innej możliwości - bo musisz powiedzieć linkerowi...
Witam. Postanowiłem napisać własny filtr Kalmana ponieważ nie mogłem na trafić na konkretną i szybką implementacje filtru na mikro-kontrolery AVR dla akcelerometru i żyroskopu. Jako podstawowe źródło informacji posłużył mi ten o to PDF : [url=http://twingo.ict.pwr.wroc.pl/~kona... Mam kilka pytań i wątpliwości...
[syntax=c] volatile struct { uint8_t pin_0; uint8_t pin_1; uint8_t pin_2; uint8_t pin_3; uint8_t pin_4; uint8_t pin_5; uint8_t pin_6; uint8_t pin_7; } PWM_data={253,250,240,220,200,180,160,1}... [/syntax] No tak- to działa. Struktura jest volatile- co do zawartości- nie mam pewności czy każdy element struktury też jest volatile. No ale- jak mi napiszesz-...
Witam volatile struct _sTime { volatile uint8_t uiHours; volatile uint8_t uiMinute; volatile uint8_t uiSecond; }; ... ... if((60*sTime.uiMinute + sTime.uiSecond)>=600) { eMAIN_AutomatState = SERVICE_accepted; } if(true==volatileEverySecondsToggle && FREE==TxBufor_0.eTxStatuss)//tylko do spr. że...
Wszystko zależy od kontekstu w jakim używa się zmienne volatile. Wezmy najprostszy przypadek: [syntax=c] struct shared { uint8_t tab[16]; uint8_t idx; }; struct shared s; void isr(void) { s.tab[s.idx] = 1; } int main(void) { s.idx = 5; irq_enable(); while(1){ while(!s.tab[s.idx]); /*Do something*/ s.tab[s.idx] = 0; } } [/syntax] Oczywiście wiadomo,...
Jeśli masz zmienną / stałą, to możesz jej nadać wartośc początkową jak każdej innej - to w jakiej sekcji się znajduje nie ma znaczenia. No tak. Zupełnie nie pomyślałem. Bo zastanawiałem się gdzie miało by być takie przypisanie wartości początkowej. I w ogóle nie pomyślałem o inicjalizacji ;p Nie mogą się zmienić o +4. Jeśli masz np uint8_t, uint16_t,...
Witam, przeglądałem posty na temat pól bitowych, sam ich czasami używam, ale potrzebuje stworzyć tablice pól bitowych, a dokładnie to chcę odwoływać się do pól poprzez indeks, a nie tylko nazwe. Wydawałoby się to proste: struct TPole{ unsigned char bit:1; }; volatile struct TPole Pole[100]; i teraz odwołanie powinno wyglądać :...
volatile struct { unsigned char icp_int: 1; unsigned char int0_int: 1; unsigned char rx_int: 1; unsigned char spi_int: 1; unsigned char adc_int:1; } intflags; i przerwanie: SIGNAL(SIG_USART_RECV) { // USART RX interrupt uint8_t c; c = UDR0; if (bit_is_clear(UCSR0A, FE0)) { rxbuff = c;...
Klepnąłęm kawałek kodu na STM32F0x dla obsługi transmisji uK=>PC. Jednak pojawił się dziwny objaw. Może ja nie widzę błędu.... Warto aby ktoś zerknął w ten kod: #define TBUF_SIZE_UART2 128 struct uart2_tx_buf_st { u16_t in; /* indeks zapisu */ u16_t out; /* indeks odczytu */ u16_t dat; /* licznik danych w buforze */ char buf [TBUF_SIZE_UART2];...
Czekaj...bo nie wiem czy dobrze załapałem ideę: chcesz w jednym miejscu sobie zdefiniować powiedzmy port dla wyśw. 7-seg, a potem go przepiąc i jedyne co redefiniować to jego piny, bez przekładania tych definicji typu 7_SEG_A_PORT, 7_SEG_A_DDR itd., tak? A jakbyś ugryzł to tak np.: [syntax=c] struct port_s { volatile uint8_t * led; volatile uint8_t...
Jak to jest z atrybutem volatile dla struktur? Gdy struktura ma volatile to wszystko co się znajduje w strukturze jest volatile? Czy dodatkowo każdy element struktury trzeba oznaczać jako volatile? struct nazwa_struktury { uint8_tval1; uint8_tval2; } volatile x; To mogę już używać w x.val1 i x.val2, w przerwaniach i w pętli głównej programu?...
Witam, przewertowałem już kilka tematów i specyfikację avr-gcc ale nie znalazłem odpowiedzi na moje pytanie. Mianowice czy da się w jakiś sposób zrobić aby zmienna (nie wskaźnik) w strukturze [syntax=c] struct _A { volatile unsigned char pa; }; [/syntax] odpowiadała adresowi np. 0x1B (PORTA w Atmega32). Wiem że taki efekt można uzyskać za pomocą wskaźników...
To bardzo ciekawe bo dla takiego kodu: [syntax=c]struct foo { volatile int a; int b; foo() : a(0xbc), b(0xaa) {} }; int main(){ foo bar; return 0; } [/syntax] Main jest pusty. Kompilowane na -O2.
No że mam w każdego typu strukturze jedno pole przeznaczone na semafor, potem wykonuję wyżej wypisane makro na tym polu. Dodano po 15 Jest, jest, rozkminiłem to, jednak dodanie modyfikatora volatile przy definicji pola rozwiązuje problem, wcześniej omyłkowo dodałem modyfikator do nie tego pola co trzeba. struct { volatile uint32_t semafor :...
Hej Używam dokładnie takich samych impulsatorów. Ten kod działa u mnie na przerwaniach: #define ENCODER_PIN0_DIRDDRB #define ENCODER_PIN0_PORTPORTB #define ENCODER_PIN0 (1<<PB0) #define ENCODER_PIN0_READ PINB #define ENCODER_PIN1_DIRDDRB #define ENCODER_PIN1_PORTPORTB #define ENCODER_PIN1 (1<<PB1) #define ENCODER_PIN1_READ...
Nie pytam, jak robi to kompilator X, tylko pytam, czy aby uczynić zadość standardowi C każdy kompilator musi zrealizować tę zmienną w pamięci. Moim zdaniem NIE musi. Musiałby tylko wtedy, gdyby w kodzie znalazło się odwołanie do jej adresu. Nie musi. Ale odnosi się to tylko do takiej funkcji jak była w pierwszym poscie. Czyli do funkcji która nie wywołuje...
Może lepiej zdefiniować typ zawierający jedną komórkę tablicy (w pliku nagłówkowym), po czym wpakować tam całą tablicę jako statyczną? dane.h: typedef struct { volatile unsigned char tekst[15]; volatile unsigned char start_x; volatile unsigned char ID; volatile unsigned char Page; volatile unsigned char Up; volatile unsigned char Down;...
Czy zmienna złożona typedef struct Modbus { volatile char ErrorFrame; volatile char ErrorOrder; volatile char TimeOut; volatile char Message; volatile char SendBlank; volatile char SupervisorTimer; volatile char ErrorAddress; }FlagProtocol; volatile FlagProtocol FlagModbus; zostanie zainicjowana automatycznie (do wartości 0) ?
Cześć, próbuję zdefiniować sobie struktury, które pozwolą na dostęp do pamięci USB w bardziej cywilizowany sposób. Mniej więcej coś takiego: [syntax=c]#include <cstdint> #include <new> struct BufferDescriptionTableEntry { volatile uint16_t addr; volatile uint16_t count; } __attribute__((packed)); struct EndpointBufferDescription { BufferDescriptionTableEntry...
Może to dlatego, że GIOB to jest makro a nie zmienna. Wydłubałem trochę kodu z twoich plików źródłowych: [syntax=c]#define __IO volatile typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef; #define PERIPH_BASE ((uint32_t)0x40000000) #define...
Poradnik spoko - zauważyłem lepszą przydatność wygenerowania pojedynczego pliku nagłówkowego z rejestrami, skrojonego na miarę, w postaci struktury unii, niżeli używanie wyciętych fragmentów pliku nagłówkowego. Niestety trzeba uważać przy tworzeniu takiego pliku nagłówkowego i pilnować poprawności z dokumentacją: [syntax=c] #include <stdint.h>...
Ja osobiście użyłem kondensatorów i następującego kodu: struct Encoder { u08 last; // Last read of encoder u08 current; // Current state of encoder int value; }; volatile struct Encoder encoder; void encoderCheck(void) { u08 v = 0; if(ENCODER_PIN0_READ & ENCODER_PIN0) { v = v + 1; } if(ENCODER_PIN1_READ &...
Używam 16bitowego koloru, nie mam systemu operacyjnego, problem z jakim się borykam jest raczej opisany w podanym przez Ch.M. pdfie na str.14 pod tytułem "7.2 Priority-Based Arbitration" dokładnie to zdanie "image on the screen is shifted vertically/horizontally." tak się to zachowuje. I faktycznie aby naprawić problem robię : "To resynchronize the...
Różnice rzędu 2 instrukcji jakoś do mnie w tym przypadku nie trafiają. Czyli różnice czterech czy sześciu bajtów flasha (zakładam że na AVR jedna instrukcja ma 2 bajty) do Ciebie nie trafiają, ale różnica jednego bajta w RAM już trafia? Widzisz niekonsekwencję? Ja tu data race nie widzę. Czy jest coś polem bitowym czy int-em. (i abstrahujmy od tego...
Mój przebiegły umysł wypłodził coś takiego, napisałem to na luźno jako koncepcję, bez sprawdzanie tego w praktyce :P [syntax=c]/* * main.c * * Created on: May 19, 2012 * Author: tymon_x */ #include "stdint.h" #include "stdio.h" // BUTTONS ////////////////////////////////////////... typedef enum E_BUTTON_ACTION { Button_Down, Button_Release,...
To problem podstawowy leży tutaj: line oraz index są typu char, a indeksy w tablicach powinny być typu int. Możesz to rozwiązać na dwa sposoby: Sposób 1. zmieniając typy line oraz index na int Sposób 2. zostawiając zmienne line oraz index jako char ale wymuszając jawnym rzutowaniem konwersję w każdej linii tego wymagającej [syntax=c] if (pwm_index[(int)pwm_led[(int)line][0].in...
Chyba mam [syntax=c]typedef struct { volatile uint8_t* Port; volatile uint8_t* Pin; volatile uint8_t* Ddr; } AVR_SFR_GPIO; const AVR_SFR_GPIO GPIO[] = { #ifdef PORTA { .Port = &PORTA, .Pin = &PINA, .Ddr = &DDRA }, #endif { .Port = &PORTB, .Pin = &PINB, .Ddr = &DDRB }, { .Port = &PORTC, .Pin = &PINC, .Ddr = &DDRC },...
Witam. Po dość długim czasie postanowiłem powrócić do programowania AVR ze względu na mały projekt który planuję w niedalekiej przyszłości. Zaopatrzyłem się w oprogramowanie, mikrokontroler i do dzieła. Po całym dniu oprogramowywania różnych peryferiów utknąłem na ADC. Otóż mam taki problem, że nie działa mi procedura obsługi przerwania od ADC umieszczona...
Czy taka unia: Powinno działać, ja tylko dodałbym volatile, żeby kompilator widząc const za bardzo nie optymalizował.
Ad 1: [syntax=c]// bitfield definitions typedef union { struct { unsigned T2CKPS :2; unsigned TMR2ON :1; unsigned TOUTPS :4; }; struct { unsigned T2CKPS0 :1; unsigned T2CKPS1 :1; unsigned :1; unsigned TOUTPS0 :1; unsigned TOUTPS1 :1; unsigned TOUTPS2 :1; unsigned TOUTPS3 :1; }; } T2CONbits_t; extern volatile T2CONbits_t T2CONbits (at) 0x012;[/syntax]...
Odpowiednie typedefy są w nagłówku stdint.h Co do podziału pomiędzy przerwanie a program główny to pewnie zapomniałeś modyfikatora volatile przy deklaracji zmiennych, które są dzielone pomiędzy przerwaniem a main(). Co do "tablicy czujników": struct czujnik { uint8_t adres; /* do wyboru czujnika na szynie */ uint8_t ileProbek; uint16_t probki[ROZMIAR];...
W pliku LPC1768.h masz taką definicję: #define CCR (*(volatile unsigned char *)0x40024008) w pliku core_cm3.h masz taką linijkę: typedef struct { ... __IO uint32_t CCR; /*!< Configuration Control Register */ ... } SCB_Type; Definicja z pierwszego zostaje wstawiona do drugiego i powstaje chaos. Nie ma tu prostego rozwiązania, możesz spróbować...
Przykład dla komercyjnego RealView Development Suite (RVDS): [syntax=c] typedef struct { volatile unsigned x: 1; volatile unsigned y: 1; } st __attribute__((bitband)); st s; int main() { s.x = 1; s.y = 0; for (;;); } [/syntax] Po kompilacji: [syntax=asm] 0800024c <main>: 800024c:4802 ldrr0, [pc, #8]; (8000258 <main+0xc>) 800024e:2101 movsr1,...
Witam. Piszę ponieważ mam problem z programowym PWM na attiny2313A. Ustawiam Timer w tryb CTC. Po zrównaniu TCNT0 z OCR0A powinno samo wyzerować rejestr TCNT0. Niestety tak się nie dzieje, jeśli sam się tym nie zajmę to serwa szaleją. Z obliczeń wynika, że przerwanie TIMER0_COMPA_vect powinno wykonywać się co 0,01ms. PWM ma działać tak: Uruchamiamy...
To może być napisał taki scenariusz w C... Poniżej koncepcja portów PWM napisana w "zwykłym" C #include <stdio.h> #define TAU1 10000 #define TICKS 50 #define TICKS2 2 struct PWM { int width; }; volatile int clock10ms = TICKS; volatile int clock05s = TICKS2; int i; struct PWM pwms[4]; void interrupt(void) { printf...
Jeśli chcesz gotowego rozwiązania to napiszę jak sam robię takie systemy: Deklaruję pewną strukturę globalną, koniecznie volatile, w której umieszczam flagi w zależności od tego ile ich potrzebuję, np.: [syntax=c]volatile struct sZmienna { unsigned char Pomiar :1; unsigned char Timer :1; unsigned char Odswiez_LCD :1; //itd. }Zmienna;[/syntax] Następnie...
Witam, ostatnio pisze bibliotekę służącą do eliminacji drgań styków w przyciskach. Będzie to działało w ten sposób, że w timerze wywołujemy funkcje obniżającą czas po którym możemy wcisnąć przycisk kolejny raz. Tak samo w kodzie - używamy funkcji z biblioteki która robi wszystko za nas :) Jednak napotkałem na taki problem - gdzie zastosować volatile...
Może mój przykład został źle dobrany, ale poprawienie ISR'a lub usunięcie powoduje generowanie identycznego kodu wynikowego, więc problem dalej występuje. Generalnie zmienne, które nie są volatile, nie powinny być używane do komunikacji program-przerwanie (mimo że wiele osób, w tym ja czasami tak robi, tyle że u mnie odnosi się to co najwyżej do tablic)....
Na oscylogramie widać podstawę czasu przypadającą na działkę więc wrzuciłem aby ktoś porównał to z tym jak ma być, więc dlaczego twierdzisz że nie jesteś w stanie odczytać zależności czasowych? Co mi da wrzucenie przez kogoś swojego oscylogramu z działającej komunikacji? Ano to że wówczas dokonam właśnie porównania z timingami które ja mam u siebie...
Nie do końca umiem wyjaśnić, dlaczego C++ różni się tutaj od C, ale mam inną propozycję, rodem z ANSI C :) Przykładowy kod można przepisać: #include <stddef.h> typedef struct { int first; int second; int third; } type_t; #define ADDRESS 0x12345678 const int data = (ADDRESS + offsetof(type_t, second))*2; int main(void)...
AVE... Od paru dni próbuję napisać pewien program dla PIC16F1513 w XC8, którego dopiero się uczę. To ogólnie rzecz biorąc mój pierwszy poważny kontakt z C w ogólności, więc nie do końca rozumiem ten język. Mam następującą deklarację struktury/unii: Main.c:234: error: (196) struct/union required Main.c:234: error: (182)...
Mam następujący problem: dostaję ciąg znaków z rs'a, który zapisują do jednej zmiennej i chcę z tego ciągu wyciągnąć dwa podciągi i zapisać je do jednego wiersza tabeli struktur. Definicje: //przed main: #define UART_MAXBUFF 37 char uart_rx_buffer[UART_MAXBUFF+1]; //w main: char bufor[20] = ""; volatile typedef struct...
Mój kod /* UART Buffer Defines */ #define UART_RX_BUFFER_SIZE 4 /* 2,4,8,16,32,64,128 or 256 bytes */ #define UART_TX_BUFFER_SIZE 16 #define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 ) #if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK ) #error RX buffer size is not a power of 2 #endif #define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE...
AVE... We wszystkich układach, z którymi ja miałem do czynienia wartości były równane do prawej, inaczej pisząc little endian. W przypadku MCU ma to znaczenie tylko dla timerów/liczników i ADC, i tylko wtedy, gdy chcemy by to miało znaczenie. Dla przykładu weźmy PIC16F1827. Układ ma 16-bitowy Timer1, który jest inkrementowany albo przez wybrany pin,...
Przykład podałeś dobry ale zapewniam że nigdy nie dokonałem operacji przypisania na statycznym łańcuchu bo taka nie ma sensu. W C trzeba to robić za pomocą strcpy itp. Mam pytania dotyczące kolejnych warningów: (6) warning: array subscript is above array bounds Ten jak rozumiem dotyczy przekroczenia zakresu tablicy co w takiej funkcji: (7) warning:...
Wrzucę tutaj rozwiązanie problemu , może ktoś tu jeszcze trafi :D Wystarczyło przypisać adresy funkcji do wskaźników : Dodano po 1 Masz rację . Myślałem trochę inaczej , że już sama nazwa wskaźnika jak funkcji na którą ma wskazywać przypisuje mu jej adres. Jest odwrotnie to nazwa może być wskaźnikiem. Tak jak w przypadku tablic. Tzn nie jest konieczny...
Od kilku dni zabawiam się kamerką OV7670, próbuję pobrać z niej obraz w formacie RGB565 i o mało ambitnej rozdzielczości QCIF(bo taki zmieści się w całości w RAM). Program, który napisałem ma za zadanie w przerwaniu pobrać obraz do pamięci, zatrzymać przerwanie i zapisać zawartość do pliku bmp. Oto mój kod : Otw. pliku 0 Init OV7670 1 System Clock 120...
Pomogło dodanie volatile w strukturze. Dzięki, teraz wszystko działa jak należy. [syntax=c]struct GLOBAL_FLAGS //brief Flags for status information { //! True when PID control loop should run one time volatile uint8_t pidTimer:1; volatile uint8_t dummy:7; } gFlags = {0, 0};[/syntax] Zastanawiam się tylko dlaczego nie było to zaimplementowane w kodzie...
:arrow: sandrak24 Chcesz mieć tablicę, gdzie będziesz miał wpisane numery portów i bitów do ustawienia w programie w stan wysoki? O to chodzi? Bo, prawdę mówiąc, też nie rozumiem, co znaczy, że porty ustawione w tablicy... W każdym razie, jeżeli chodzi chodzi o to, co napisałem, to np. [syntax=C] typedef struct { volatile uint8_t *port; uint8_t bit_mask;...
problem na razie nierozwiązany.. wyłączyłem przerwania w ogóle, kod (fragmenty )wygląda teraz tak: [syntax=c] extern struct message* RX_que; extern volatile uint8_t RX_que_ptr; extern volatile uint8_t RX_que_cnt; struct message { struct message* next; struct message* prev; uint8_t* content; uint16_t size; }; uint8_t add_to_que (struct message** que_ptr,...
Tak Freddie Chopin, Twoja rozbiegówka LPC2103 po zmianie rozmiaru pamięci i przydzeleniu troche dla obsługi przerwań zadziałała. MEMORY { rom (rx): org = 0x00000000, len = 512k ram (rwx): org = 0x40000000, len = 32k } __user_system_stack_size = 1024; __fiq_stack_size = 0; __irq_stack_size = 128; __supervisor_stack_size...
Witam. Chcę stworzyć menu z różnymi elementami do wyświetlania na ekranie. Chcę w strukturze umieścić wskaźnik do zmiennej. [syntax=c]struct PozycjaMenu { uint8_t x; uint8_t y; volatile uint8_t *liczba; // wskaźnik do zmiennej uint8_t LiczbaCyfr; uint8_t MiejscePrzecinka; };[/syntax] będą tam jeszcze inne dane ale później. Stworzyć pozycję menu [syntax=c]struct...
Witam Mam pytanie dlaczego zmienna która inkrementuje się tutaj: [syntax=c] if(klawisz_wcisniety(ZAWODNIK_M)) { lcd_cls(); zawodnik_przejazdy_read(); zawodnik_przejazdy[zawodnik.numer].okraz... = 0; zawodnik_przejazdy_update(); zawodnik.numer++; zawodnik_przejazdy[zawodnik.numer].okraz... zawodnik_przejazdy_update(); } [/syntax] Inkrementuje się...
Nie podałeś kompilatora, ani jego wersji. Bo założyłem że taka optymalizacja to jakiś element języka C a więc niezależny od kompilatora. BTW, dla konkretnych funkcji pewnie o wiele więcej zyskasz stosując konkretne atrybuty związane z inlinowaniem, rozwijaniem pętli, dzieleniem typów itd. Raczej nie bo główną rzeczą którą chcę uzyskać to brak optymalizacji...
(...) no), może być np #define LED A3, gdzie A3 jest odpowiednikiem zarówno DDRA |= (1 << PA3), PORTA |= (1<<PA3) jak i PINA & (1<<PA3). Umożliwi to definiowanie tablic pinów (np. do sterowania wieloma ledami) jako: const uint8_t pinLED Tworzenie takiego frameworku dla AVR GCC, który pozwalałby na wygodny dostęp do poszczególnych...
A mi się najbardziej podoba pierwsza instrukcja, która włącza HSI. Bez niej procesor w ogóle nie mógłby działać, bo nie ma źródła zegara. Ciekawe, jakim cudem w ogóle ją wykonuje... :) Kod poniżej robi to, o ci Ci chodzi - jak widać, wystarczy 9 zapisów do rejestrów, żeby skonfigurować porty i timer. Nie przezsadzaj z tymi operacjami logicznymi... [syntax=c]...
U mnie (Katowice) z DCF77 nie ma problemu, oczywiście zdarza się, że przez jakiś czas nie działa, ale przecież nie musi - wystarczy że złapie sygnał od czasu do czasu. Z tego co zauważyłem, to strasznie przeszkadza w odbiorze DCF77 komputer. Kiedy miałem zasilane układy przez USB to generalnie był problem, gdy je zasilałem osobno - z sieci lub z baterii...
Witam wszystkich, właśnie klepię się po łysinie, ponieważ wyrwałem już sobie wszystkie włosy :( Sytuacja jest następująca: Mam takie oto definicje: - this0x21e2class CMotor*{registers}(at) R07 R06 - *(this){class CMotor{registers}(at)0x21e2... CMotor{registers}(at)0x21e2 ----------------------------------------...
Można odczytywać stan wejść w przerwaniach uzyskiwanych przy użyciu setitimer() - pewnie od systemu zależy, jakie będą odstępy czasy między nimi, można zadeklarować, jakie mają być, ale jak się zadeklaruje bardzo małe, to wychodzą większe, niż przy zadeklarowaniu nieco większych - a to dlatego, że program przestanie zdążać z obsługiwaniem przerwań....
Program na GLCD skleiłem z dwóch bibliotek - I2C Slave TMF (pierwsza książka) oraz obsługa wyświetlacza autorstwa "SunRivera" udostępnionej przez niego na Dropie. Podejrzewam, że mogłem coś namieszać w I2C - biblioteka była pisana na Atmega 88, ja skompilowałem ją na Atmega32. Kompilator protestował przeciwko obecności rejestru "TWAMR", którego 32 nie...
Te pola bitowe wyglądają tak: [syntax=c] struct flagi1// bity flag uzywanych w programie { volatile u08 KeysOn : 1 ; // bit wcisnietego klawisza volatile u08 I2C_trans_pending : 1 ; //bit trwajacej wlasnie transmisji I2C volatile u08 I2C_ACK_ERROR : 1 ; // bit wystapienia bledu I2C (NACK) volatile u08 MMC_ErrorWas : 1 ; // bit wskazujacy ze byl blad...
Ponieważ ja zawsze byłem zbyt leniwy, by pisać tak dużo instrukcji, ile potrzebują wywołania bibliotek, a jednocześnie lubię używać mikrokontrolerów z małą pamięcią, popełniłem na STM32F0 (płytka DISCOVERY) takie coś do włączania i wyłączania diod guzikiem. Program jest mało ambitny, bo ma ledwie ze 6 instrukcji w C, ale działa dobrze i może komuś się...
Jeżeli chcesz koniecznie koniecznie wykorzystać metodę, o której pisał tmf, możesz zrobić tak: [syntax=c] typedef struct _PortBits { unsigned b0 : 1; unsigned b1 : 1; unsigned b2 : 1; unsigned b3 : 1; unsigned b4 : 1; unsigned b5 : 1; unsigned b6 : 1; unsigned b7 : 1; } tPortBits; #define PORT_BITS(p) (*(volatile tPortBits*)&(p)) #define SCLK_RF_PORT...
jedyne co mogę jeszcze dołożyć to definicja struktury [syntax=c] struct connections { uint8_t detect : 3; //nr. detektora uint8_t triac : 3; //nr. triaka uint8_t setFlag : 2; //znacznik ustawienia fazy }; // zmienna connections ma zapisane w sobie // kolejności występowania faz oraz przyporządkowuje // do fazy detektor i triak volatile struct connections...
Jednak się da, bez konieczności tworzenia osobnych struktur i wpisywania nazw tych struktur w inicjalizacji innych struktur :) Nie wiem czy wszystkie kompilatory to zaakceptują.. typedef struct { u8 flags; // BTN_TRANSPARENT | BTN_TOGGLE | BTN_VISIBLE u16 y_size; u16 x_size; const u8 *file; } btn_vars_t; // STALA struktura we flashu... typedef...
Witam serdecznie! Natknąłem się na taki oto problem. Napisałem sobie funkcję, która służy do ustawiania rejestru Mach Control Register i wygląda tak: MCR ustawia jeszcze dodatkowo przerwanie dla Mach3 i reset dla Mach2. Czy ktoś z Was, szanowni Koledzy spotkał się już z takim problemem? Albo orientuje się skąd on może wynikać? Czyżby symulator był błędnie...
Witam ponownie, próbowałem ogarnąć na początek funkcję eeprom_write_block. Oto fragment kodu: [syntax=c] typedef struct { // tu są chary, inty, tablice } TEngine; // zmienna w RAM volatile TEngine Engine; // Kopia będzie w EEPROM TEngine EEMEM eeEngine; // i gdzieś w kodzie dalej eeprom_write_block( &Engine, &eeEngine, sizeof(Engine) ); [/syntax] Przy...
A w pliku stm32f10x.h jest: [syntax=c]#define SPI_CR2_TXEIE ((uint8_t)0x80) /*!<Tx buffer Empty Interrupt Enable */[/syntax] Zauważ że to przerwanie będzie generowane po każdym opróżnieniu bufora TX. Powinieneś włączyć je dopiero pod koniec czyli w Twoim przypadku podczas obsługi przerwania od zakończenia działania DMA. Lepiej jednak wróćmy do wcześniejszej...
kod dla mastera [syntax=cpp]#include<avr/io.h> #include<util/delay.h> #include<util/twi.h> #include <avr/interrupt.h> #define I2C_STARTError 1; #define I2C_NoNACK 1; #define I2C_NoACK 1; unsigned int address = 0x20; //identyfikator urzadzenia slave unsigned int byte = 0x01; // wysłanie danych unsigned int bytee = 0x05; // wysłanie...
ok flagi bitowe tworzę tak : typedef struct { unsigned char bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1; } FlagBits; typedef union { FlagBits Bits; unsigned char Byte; } Flags; volatile Flags flaga ; #define jakas_flaga flaga.Bits.bit0 ale potrzebuję tablicy o rozmiarze 128 komórek...
Witam! Procesor ziała z wewnętrznym oscylatorem 8MHz. Cały mój problem zawarłem w temacie, więc po prostu zaprezentuję kod, ew. wyjaśnienia pod kodem. Struktura danych dla RC5: [syntax=c]volatile struct rc5_state_t { uint16_t ref_time; char code[14]; uint8_t code_count; char stan; //Poniżej zmienne wyjściowe po zdekodowaniu RC5 uint8_t address :5; uint8_t...
mirekk36 - póki co, może obejdzie się bez angażowania Twojego czasu na analize moich krzaczków ;) Problem występuje także wtedy, gdy wyłączę podświetlenie (w opcjach ustawię na 0). Więc (byćmoże prądożerne) podświetlenie lcd nie jest przyczyną. Po założeniu loga na RSie doszedłem do tego, ze zawiesił się przy odczycie danych z drugiego modułu - czyli...
Wstawiam kod obsługi odbioru danych w przerwaniu, gdzie odebrane dane są zapisywane do bufora a po zapełnieniu bufora do zewnętrznej pamięci, w tym przypadku na karte SD, docelowo do pamięci Flash - może komuś się przyda. [syntax=c] #include "LPC17xx.h" #include "lpc17xx_systick.h" #include "lpc17xx_uart.h" #include "lpc17xx_pinsel.h" #include "diskio.h"...
No to próbuję: [syntax=c] //* \section OA Original author //* Andy Gayne is the original author of this application note. //*/ //program z noty Atmela 136 //przerobiony na ATMega8, kwarc 11059200 i okrojony program #include <avr/io.h> #include <avr/interrupt.h> //! Pin mappings #define CHMAX 6 // maximum number of PWM channels #define PWMDEFAULT...
Dodałem zapamiętywanie obsługi sygnałów przed wywołaniem Sequencera, i przywracanie oryginalnego stanu po jego zakończeniu - ale nadal jest SIGSEGV. [syntax=c]#include "epicsThread.h" #include "iocsh.h" #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 #endif #include "extcode.h" #include <signal.h> #include <stdio.h> #include <unistd.h>...
1) Za czekający na flagę while() w przerwaniu grozi ci publiczny lincz i ukamienowanie 2) ten ISR moze i nic nie gubi ale nigdzie nie masz flagi 'odebrałem_paczke_i_czekam_na_jej_obslug... Pewnie dlatego cos ci sie gubi gdzies glebiej w kodzie. Powinienes miec conajmniej podwójne buforowanie, o ile nie zupelnie oddzielne FIFO. Najlepiej tagowane......
Spróbowałem Twojego pomysłu z NOLOAD: [syntax=c] ._heap (NOLOAD): { . = ALIGN(4); __heap_start = .; PROVIDE(__heap_start = __heap_start); . += __heap_size; . = ALIGN(4); __heap_end = .; PROVIDE(__heap_end = __heap_end); } > sdram .frame (NOLOAD): { . = ALIGN(4); __frame_start = .; PROVIDE(__frame_start = __frame_start); . = ALIGN(4); *(.frame) . = ALIGN(4);...
Np coś takiego [syntax=c]struct{ unsigned int ModTempSet; unsigned int ModTermAkt; unsigned int ModObn; unsigned int ModAdr; unsigned int FAKE; unsigned int PUMP; unsigned char End; }Mod03; char *StructPtr; volatile int a, b; StructPtr =(char*) &Mod03.ModTempSet; //adres poczatku aa= (int)StructPtr; StructPtr =(char*) &Mod03.End; //adres konca bb= (int)StructPtr;...
Witam. Parę pytań, przemyśleń, proszę o wypowiedzenie się. Temat dotyczy programowania embedded C głownie mikrokontrolerów raczej większych 32 bitowych. 1. Stosowanie wielu zmiennych globalnych jest bee Czy w świecie embedded bez dynamicznej alokacji pamięci da się inaczej? Zakładając, że mamy jakieś stałe duże struktury globalne (zawierające mnóstwo...
typedef struct volatile przerwać typedef volatile
programowanie bramy normstahl falujące niskie obroty kosiarka wiena mostek
pralka indesit cieknie pralka indesit cieknie
Słabe ciśnienie spryskiwacza tylnej szyby w Passacie B5 1.9 TDI kombi Działa tylko lewa strona słuchawek - co robić?