MCU CH552G

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Dumitru
Stály člen
Stály člen
Príspevky: 372
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 32

MCU CH552G

Príspevok od používateľa Dumitru » 13 Jan 2022, 18:01

Ahojte dostal sa mi do rúk tento mcu založený na baze E8051

Nakoľko nemám s 8051 žiadne skúsenosti napísal som jednoduchý kód kde len spínam výstupný pin

Kód: Vybrať všetko

#include <ch552.h>
int main() 
{
// nastavenie frekvencie na 6Mhz
SAFE_MOD = 0x55; // INPUT IN SAFE_MOD
SAFE_MOD = 0xAA; // INPUT IN SAFE_MOD

CLOCK_CFG = 0x83; // 6Mhz

SAFE_MOD = 0x01; // OUTPUT IN SAFE_MOD
//----------------------------------------------------------
P1_MOD_OC = 0x00; // push-pull output
P1_DIR_PU = 0xFF; // output 
P1_1 = 1;
    while(1)
    {
        P1_1 = !P1_1;
    }
}



V podstate napísaný program vykonáva to čo ma spína výstupný pin len s frekvenciou 500khz
Tu je náhľad do knižnice ch552.h

Kód: Vybrať všetko

/*-------------------------------------------------------------------------
   ch552.h: Register Declarations for the CH552 Processor 

  -------------------------------------------------------------------------*/

#ifndef __CH552_H__
#define __CH552_H__

/*  BYTE Register  */

__sfr __at (0xB9) CLOCK_CFG ;
__sfr __at (0xA1) SAFE_MOD ;

__sfr __at (0x92) P1_MOD_OC ;
__sfr __at (0x93) P1_DIR_PU ;

__sfr __at (0x90) P1 ;

/* BIT Register  */
__sbit __at (0x91) P1_1 ;

#endif
V prílohe prikladám aj datasheet na strane 24 je popísane ako sa ma meniť frekvencia procesoru.

Kompilátor SDCC

Nerozumiem prečo to kmitá len 500khz

Za odpovede vopred ďakujem .
Prílohy
CH552DS1.PDF
(796.28 KiB) 85 stiahnutí
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: MCU CH552G

Príspevok od používateľa peterple » 13 Jan 2022, 18:44

Normálna 8051 má 12 cyklov na inštrukciu. Takže by to malo byť 250kHz. Novšie 8051 majú aj menej cyklov na inštrukciu. tento má možno 6. Naštuduj v DS

Edit: píšu hneď na prvej strane že väčsina trvá jeden cyklus. Ale čo je to vačsina. A potom je otázka kolko inštrukcií je v tom loope. Musíš ísť na úroveň asm. Inak sa to zistiť nedá
1
Obrázok 1
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Dumitru
Stály člen
Stály člen
Príspevky: 372
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 32

Re: MCU CH552G

Príspevok od používateľa Dumitru » 14 Jan 2022, 18:32

Ahoj ďakujem za odpoveď teraz je mi to jasne, myslel som si že nastavenie frekvencie my zlyháva ale je to v poriadku sedí to na 6 cyklov.

Chcel by som sa vás opýtať, momentálne si píšem knižnice pod daný procesor UART , SPI mam spojazdnene ale bez využitia prerušení a nie je mi jasne ako postupovať v prípade prerušení ako napísať v jazyku C ISR rutinu .

Len pre skúšku som si zvolil Timer0
Podľa datasheetu pre timer0 je to Interrupt number 1
Obrázok

napísal som takýto kód :

Kód: Vybrať všetko

void timer0_handler(void)__interrupt 1
    {
      P1_1 = !P1_1;
      TH0 = 128;
    }
a aj to funguje len presne nerozumiem podľa čoho kompilátor vie že __interrupt 1 je na adrese 0x000B

Za odpoveď vopred ďakujem.
Prílohy
image.png
0

miso156
Pokročilý člen
Pokročilý člen
Príspevky: 648
Dátum registrácie: 06 Dec 2020, 11:46
Bydlisko: Banska Stiavnica
Vek: 38

Re: MCU CH552G

Príspevok od používateľa miso156 » 14 Jan 2022, 19:18

V subore "ch552.h" ktory mas nalinkovany je definovany interrupt number:

Kód: Vybrať všetko

#define INT_NO_TMR0       1         // interrupt number for timer0
, taktiez adresa prerusenia:

Kód: Vybrať všetko

#define INT_ADDR_TMR0     0x000B    // interrupt vector address for timer0
0
"No pain, no gain." (KC238)

Dumitru
Stály člen
Stály člen
Príspevky: 372
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 32

Re: MCU CH552G

Príspevok od používateľa Dumitru » 14 Jan 2022, 19:40

Ahoj nemám používam svoj vlastný ch552.h

Kód: Vybrať všetko

/*-------------------------------------------------------------------------
   ch552.h: Register Declarations for the CH552 Processor

  -------------------------------------------------------------------------*/

#ifndef __CH552_H__
#define __CH552_H__

/*  BYTE Register  */

__sfr __at (0xB9) CLOCK_CFG;
__sfr __at (0xA1) SAFE_MOD;

/* P1 */
__sfr __at (0x90) P1;
__sfr __at (0x92) P1_MOD_OC;
__sfr __at (0x93) P1_DIR_PU;

/* Power Supply and Sleep Control Register */
__sfr __at (0x87) PCON;

/* UART0 */
__sfr __at (0x98) SCON;
__sfr __at (0x99) SBUF;

/* UART1 */
__sfr __at (0xC0) SCON1;
__sfr __at (0xC1) SBUF1;
__sfr __at (0xC2) SBAUD1;

/* Timer0/1/2 */
__sfr __at (0xC9) T2MOD;

/* Timer0/1 */
__sfr __at (0x89) TMOD;
__sfr __at (0x88) TCON;

/* Timer0 */
__sfr __at (0x8C) TH0;
__sfr __at (0x8A) TL0;

/* Timer1 */
__sfr __at (0x8D) TH1;
__sfr __at (0x8B) TL1;

/* Interrupt Register */
__sfr __at (0xA8) IE;



/* BIT Register  */

/* P1 */
__sbit __at (0x90) P1_0 ;
__sbit __at (0x91) P1_1 ;
__sbit __at (0x92) P1_2 ;
__sbit __at (0x93) P1_3 ;
__sbit __at (0x94) P1_4 ;
__sbit __at (0x95) P1_5 ;
__sbit __at (0x96) P1_6 ;
__sbit __at (0x97) P1_7 ;

/*------------------------------------------------------------*/

/* CLOCK_CFG */
#define _3Mhz 0x82
#define _6Mhz 0x83
#define _12Mhz 0x84
#define _16Mhz 0x85
#define _24Mhz 0x86

/* UART0 SCON Register */
#define RI  0
#define TI  1
#define RB8 2
#define TB8 3
#define REN 4
#define SM2 5
#define SM1 6
#define SM0 7

/* UART0 PCON Register */
#define SMOD 7 // 0- slow mode 1-fast mode

/* UART1 SCON1 Register */
#define U1RI  	0
#define U1TI  	1
#define U1RB8 	2
#define U1TB8 	3
#define U1REN 	4
#define U1SMOD	5
#define U1SM0	7

/* Timer0/1/2 T2MOD Register */
#define bTMR_CLK 7

/* Timer0 TCON Register */
#define TR0 4
#define TF0 5

/* Timer0 TMOD Register */
#define bT0_M0 		0
#define bT0_M1 		1
#define bT0_CT		2
#define bT0_GATE 	3

/* Timer0 T2MOD Register */
#define bT0_CLK 4

/* Timer1 TCON Register */
#define TR1 6
#define TF1 7

/* Timer1 TMOD Register */
#define bT1_M0 		4
#define bT1_M1 		5
#define bT1_CT		6
#define bT1_GATE 	7

/* Timer1 T2MOD Register */
#define bT1_CLK 5

/* Interrupt IE Register */
#define EX0  	0
#define ET0  	1
#define EX1 	2
#define ET1 	3
#define ES 	4
#define ET2	5
#define E_DIS	6
#define EA		7

#endif
Ktorý si postupne dopĺňam
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: MCU CH552G

Príspevok od používateľa peterple » 14 Jan 2022, 23:01

Nakoľko hw prerušenie nie je v klasickom C nijak poriešené, tak je to záležitosť len toho ktorého kompilátora. Preto treba študovať dokumentáciu kompilátora. Klasické #define s tým nemá moc spoločné. To vytvára obyčajné textové makrá a ohľadom ISR je k ničomu. Opíja sa to rožkom cez nejaké atribúty funkcií. Do tohto moc nevidím, nepíšem kompilátory. Toto je tak otázka na stackoverflow.
Ja to beriem tak že je to vlastnosť kompilátora pre danú rodinu MCU a každý poskytovateľ to robí po svojom. Aj keď samozrejme sa opisuje navzájom takže nejaké spoločné črty to má.
Rýchle googlenie napríklad pre keil 8051
https://www.keil.com/support/man/docs/c ... tfuncs.htm
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok